我使用以下格式逐行#{string:start:length}
从 wget 的文件中提取文件名。.listing
文件的格式我想我们都熟悉:
04-30-13 01:41AM 7033614 some_archive.zip
04-29-13 08:13PM <DIR> DIRECTORY NAME 1
04-29-13 05:41PM <DIR> DIRECTORY NAME 2
所有文件名都从 pos:40 开始,因此设置:start
为 39,不:length
应该(并且确实)返回每一行的文件名:
#!/bin/bash
cat .listing | while read line; do
file="${line:40}"
echo $file
done
正确返回:
some_archive.zip
DIRECTORY NAME 1
DIRECTORY NAME 2
但是,如果我有更多创意,它就会中断:
#!/bin/bash
cat .listing | while read line; do
file="${line:40}"
dir=$(echo $line | egrep -o '<DIR>' | head -n1)
if [ $dir ]; then
echo "the file $file is a $dir"
fi
done
回报:
$ ./test.sh
is a <DIR>ECTORY NAME 1
is a <DIR>ECTORY NAME 2
是什么赋予了?我丢失了“文件”,其余的测试看起来像是打印在来自 pos:0 的“文件目录名称 1”之上。
很奇怪,这是怎么回事?