我有一个带有if condition
和连续几行脚本的bash脚本。但是,在if condition
之后,脚本中似乎没有任何运行。例如,以下是脚本行(continue
中if 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
语句之后。任何帮助/建议都将不胜感激。
谢谢
答案 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
,您将始终跳过循环的其余部分,因此不会有其他事情被执行。此行为与所有其他编程语言相同。
continue
与break
一样,是控制循环行为的关键字。这意味着使用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