“if 条件”中的“继续”不会转到脚本的下一行



我有一个bash脚本,脚本if condition和连续的行。但是,if condition之后,脚本中似乎没有任何内容运行。例如,这里是脚本行(if conditioncontinue后的行没有反应(。

 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什么都没有显示进行打印。准确地说,问题出在if condition内的continue声明之后。任何帮助/建议都非常感谢。

谢谢你

你似乎对continue陈述有错误的解释。

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

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

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

要获得更深入的见解,请阅读 Shell 脚本中的嵌套 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

脚本的问题在于,如果你的第一个if语句的计算结果总是为 true,你将始终跳过循环的其余部分,由于continue,所以不会执行任何其他内容。此行为与所有其他编程语言中的行为相同。

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

如果您需要进一步进入下一个if statement,您需要嵌套您的if,以便检查/评估两者。

有关此问题的更多背景信息,请参阅此处。

根据您的注释,您的代码应包含嵌套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

最新更新