Linux Bash脚本continue关键字不中断循环迭代

Linux Bash脚本continue关键字不中断循环迭代,linux,bash,loops,continue,Linux,Bash,Loops,Continue,我将遵循一系列教程来学习bashshell脚本。其中一个练习是循环浏览当前目录中的文件,并在这些文件中搜索模式。如果找到该模式,则脚本应将这些文件的文件大小相加 #!/bin/sh patern=echo totalSize=0 for file in * do [ ! -f $file ] && continue if grep $patern $file > /dev/null then echo "patter

我将遵循一系列教程来学习bashshell脚本。其中一个练习是循环浏览当前目录中的文件,并在这些文件中搜索模式。如果找到该模式,则脚本应将这些文件的文件大小相加

#!/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”。它是空的。我在下面粘贴了一段输出文本。中间的3行显示循环在目录“somedir”上迭代的时间,该目录打印为“sum_files”——我的脚本名和文件大小

我不理解这种行为。空目录如何具有文件大小
但是我主要关心的是为什么continue关键字没有停止循环迭代。输出显示脚本正在运行包含grep命令的if语句,即使在找到目录时它应该停止

我已经验证了当循环到达目录时,test命令
[!-f$file]
实际上返回0,因此应该调用
&continue
。那么,为什么程序继续执行其余的循环代码并尝试grep目录,而不是像预期的那样在continue中跳过循环迭代呢?我知道这很琐碎,但我想知道这里发生了什么

输出文本 退休时匹配的模式
文件大小为396
到目前为止,大小为6385字节

在sum_文件中匹配的模式
文件大小为398
到目前为止,大小为6783字节

tp0中匹配的模式
文件大小为164

到目前为止,大小为6947字节

continue
继续循环,就像循环到达底部一样

要中断循环,请使用
break


有关bash脚本的更多信息,请参见:

关于空目录如何具有大小的问题: 从技术上讲,目录只是文件本身,为了将自己建立为目录,它们需要一些数据来让文件系统知道这一点。


使用shellcheck.net来识别脚本中的其他一些错误。你的问题没有意义……这没有意义:当循环在目录“somedir”上迭代时,中间的3行显示出来,它将该目录打印为“sum_files”。请尝试
set-x
查看结果。@gniourf\u gniourf“模式在sum\u文件中匹配---文件大小为398---到目前为止大小为6783字节”。从终端输出。每个文件输出3行文本,显示找到模式匹配时的文件名、文件大小和总和。这里我显示了for循环迭代在文件夹“somedir”上运行的异常情况,这是不应该发生的。我应该在代码中的什么地方设置-x?循环在sum\u文件上运行。将
set-x
放在
#之后/bin/sh
。事实上@gniourf\u gniourf你是对的,因为我正在我的bin文件中运行脚本,脚本文件所在的位置,所以这当然没有任何意义,因为脚本正在找到自己。LOL.我从下面的教程和这个链接中了解到:Continue将停止循环的当前迭代,break将停止整个for循环,就好像它到达了所有文件的末尾一样。当我为continue替换break时,一旦脚本找到一个不是我想要的行为的目录,脚本将停止搜索任何其他文件。返回代码0表示成功,因此将执行
&
的rhs。Shell不是C.@gniourf\u gniourf:这不是关于返回码,而是关于
[!-f$file]
求值的布尔表达式,即
true
false
。()返回代码0表示true(或者更确切地说是success)。试试看:
true;echo$?
错误;echo$?
。再一次,shell不是C。是的,这是我所理解的。现在的输出与预期一致。我通过运行echo$验证了
[!-f$文件]
?之后,当目录在循环中迭代时得到0。很抱歉给你带来了困惑。我看不见树林,看不见树木!