Bash脚本中的continue关键字未能打破循环迭代

8

我正在学习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 字节


使用shellcheck.net来识别你的脚本中的其他错误。 - chepner
你的问题没有意义...这个也没有意义: _中间的三行显示了当循环迭代目录“somedir”时,它打印为“sum_files”的内容_。尝试使用set -x查看发生了什么。 - gniourf_gniourf
@gniourf_gniourf "在sum_files中匹配到模式---文件大小为398---到目前为止的大小为6783字节"。从终端输出。每个文件都会输出3行文本,显示文件名(如果找到了模式匹配),其文件大小和总和。在这里,我展示了for循环迭代运行超过“somedir”文件夹的异常情况,这不应该发生。在代码中,我应该在哪里“set -x”? - Drok
循环运行文件_sum_file_。在#!/bin/sh之后加上set -x - gniourf_gniourf
其实 @gniourf_gniourf 你是对的,因为我正在运行我的 bin 文件中的脚本文件,所以这当然没有任何意义,因为脚本文件正在寻找自己。哈哈。 - Drok
显示剩余2条评论
2个回答

10

continue语句继续执行循环,就像已经到了其末尾一样。

要退出循环,请使用break语句。

更多关于bash脚本的信息,请参见:http://tldp.org/LDP/abs/html/index.html


FYI,返回代码为0表示成功,因此&&右侧的命令将被执行。Shell不是C语言。 - gniourf_gniourf
@gniourf_gniourf:这不是关于返回代码的问题,而是关于[ ! -f $file ]所评估的布尔表达式,即truefalse。(http://tldp.org/LDP/abs/html/fto.html) - alk
返回代码0表示真(或者说成功)。试一下:true; echo $?false; echo $?。再次强调,Shell不是C语言。 - gniourf_gniourf
是的,这就是我的理解。现在输出结果符合预期。我通过运行echo $?来验证[ ! -f $file ],当循环迭代文件夹时得到了0。对于混淆我感到很抱歉。我看不清事情的本质! - Drok
大家好,我的错误是我写了 ! 但是没有在脑海中解析它。 - alk
显示剩余4条评论

2
关于您关于一个空目录如何有大小的问题: 目录本质上也是文件,为了将自己作为目录建立起来,它们需要一些数据来让文件系统知道。

enter image description here


不过,您不应该依赖这个。一些文件系统返回0。例如,Ceph-fuse将所有包含文件的总大小报告为文件夹的大小。 - Joachim Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接