我正在学习Bash shell脚本的一系列教程。其中一个练习是循环遍历当前目录中的文件并搜索这些文件中的某个模式。如果找到了该模式,则脚本应该汇总这些文件的文件大小。
#!/bin/sh
patern=echo
totalSize=0
for file in *
do
[ ! -f $file ] && continue
if grep $patern $file > /dev/null
then
echo "pattern matched in $file"
echo "file size is `stat -c%s $file`"
fileSize=`stat -c%s $file`
totalSize=`expr $totalSize + $fileSize`
echo "size so far is $totalSize bytes"
echo
fi
done
我在运行脚本的目录中有一个名为"somedir"的文件夹,它是空的。下面粘贴了一段输出文本的片段,其中间的三行显示了循环迭代目录"somedir"时的情况,它打印出"sum_files"——我的脚本名称以及文件大小。
我不理解这种行为。一个空目录怎么会有文件大小呢?但我主要担心的是为什么"continue"关键字没有停止循环迭代。输出显示脚本正在运行下面的if语句,其中包含grep命令,即使应该停止循环迭代,如果找到一个目录就应该停止。
我已经验证了测试命令
[! -f $file]
实际上在循环到目录时返回0,因此应该调用&& continue
。那么为什么程序会继续执行其余的循环代码并尝试grep目录,而不是像预期的那样跳过循环迭代并在continue处中断呢?我知道这可能是微不足道的,但我想知道这里发生了什么。
输出文本
匹配 retirement 模式
文件大小为 396
到目前为止大小为 6385 字节
匹配 sum_files 模式
文件大小为 398
到目前为止大小为 6783 字节
匹配 tp0 模式
文件大小为 164
到目前为止大小为 6947 字节
set -x
查看发生了什么。 - gniourf_gniourf#!/bin/sh
之后加上set -x
。 - gniourf_gniourf