我有一个bash脚本,脚本if condition
和连续的行。但是,if condition
之后,脚本中似乎没有任何内容运行。例如,这里是脚本行(if condition
中continue
后的行没有反应(。
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
,所以不会执行任何其他内容。此行为与所有其他编程语言中的行为相同。
-
continue
和break
一样,是控制循环行为的关键字。这意味着使用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