if条件中的continue不会转到脚本的下一行

时间:2019-07-18 10:08:25

标签: bash shell for-loop if-statement

我有一个带有if condition和连续几行脚本的bash脚本。但是,在if condition之后,脚本中似乎没有任何运行。例如,以下是脚本行(continueif condition之后的行没有反应)。

 dir=/usr/path/tofiles
    for file in $(find $dir -name \*txt)
    do
        fbase={file%.txt}
        if [ "$step" == "1" -a ! -f "${fbase}.header" ]
            then
                continue
        fi

    ### From here nothing in the script runs #####

        if [ -f "${fbase}merged" ]
        then
                echo "$file already merged"
        fi

       files="$files ${fbase}g.txt.gz"
       cnt=$(($cnt + 1))
       if [ "$cnt" -eq "$chunksize" ]
       then
           outid=$(uuidgen)
           logfile=${outdir}/${outid}.cluster.log
           echo "sh $(pwd)/mysecript.sh $outid $files"  
       fi
    done

脚本中的第一个if condition没有运行之后,我尝试使用echo进行打印,但没有任何显示。确切地说,问题出在continue中的if condition语句之后。任何帮助/建议都将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

您似乎对continue语句有错误的解释。

continue语句跳过下面的行,并从下一次迭代开始。

while (true) {
  print(1);
  if (true) {
    continue;
  }
  print(2);
}

在上面的print(2)中,它将永远不会执行,因为它每次都会跳过并从下一次迭代开始。

要获得更深入的了解,请阅读Nested-If statements in Shell-scripting

针对您的情况,请尝试此操作

dir=/usr/path/tofiles
    for file in $(find $dir -name \*txt)
    do
        fbase={file%.txt}
        if ! [ "$step" == "1" -a ! -f "${fbase}.header" ]
        then
            if [ -f "${fbase}merged" ]
            then
                echo "$file already merged"
            fi

            files="$files ${fbase}g.txt.gz"
            cnt=$(($cnt + 1))
            if [ "$cnt" -eq "$chunksize" ]
            then
                outid=$(uuidgen)
                logfile=${outdir}/${outid}.cluster.log
                echo "sh $(pwd)/mysecript.sh $outid $files"  
            fi
        fi
    done

答案 1 :(得分:0)

脚本的问题是,如果第一个if语句的求值始终为true,则由于continue,您将始终跳过循环的其余部分,因此不会有其他事情被执行。此行为与所有其他编程语言相同。

  • continuebreak一样,是控制循环行为的关键字。这意味着使用continue可以跳过当前循环迭代的其余部分。使用break可以退出循环。

如果需要进一步处理下一个if statement,则需要嵌套if,以便对它们进行检查/评估。

有关此问题的更多背景信息,请参见here

根据您的注释,您的代码应包含嵌套的if,例如:

dir=/usr/path/tofiles
  for file in $(find $dir -name \*txt)
  do
    fbase={file%.txt}

    if [ "$step" == "1" -a ! -f "${fbase}.header" ]
    then
      if [ -f "${fbase}merged" ]
      then
        echo "$file already merged"
      fi

      files="$files ${fbase}g.txt.gz"
      cnt=$(($cnt + 1))
      if [ "$cnt" -eq "$chunksize" ]
      then
        outid=$(uuidgen)
        logfile=${outdir}/${outid}.cluster.log
        echo "sh $(pwd)/mysecript.sh $outid $files"  
      fi
    fi
done