我想写一个像这样的简单循环:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 ))
done
但是,如果循环失败,我希望中断脚本并打印错误消息,因此我这样做了:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 )) || echo error && exit 1
done
显然,它在第一次迭代时就存在了。
因此,我转向了这个解决方案
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 )) || (echo error && exit 1)
done
据我了解,它仅退出子 shell :-(
因此,我现在这样写:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 ))
if (( $? > 0 )); then echo error && exit 1; fi
done
但那太糟糕了……
除了调用运行这两个命令的函数之外我还能做什么?
答案1
使用花括号代替圆括号,这样不会产生新的子 shell:
... || { echo error; exit 1; }
请注意 - 与括号不同 - 即使在最后一条语句后也需要加上分号。
还请注意,我已经改为&&
,;
我认为如果echo
由于任何不太可能的原因而失败,您甚至应该退出;如果您真的希望在失败时继续循环,请随意将其改回来echo
。