#Example Script
wget http://file1.com
cd /dir
wget http://file2.com
wget http://file3.com
我想逐行执行bash脚本并测试每次执行的退出代码($?)并确定是否继续:
它基本上意味着我需要在原始脚本的每一行下面添加以下脚本:
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
并且原始脚本变为:
#Example Script
wget http://file1.com
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
cd /dir
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
wget http://file2.com
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
wget http://file3.com
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
但剧本变得臃肿。
有更好的方法吗?
答案 0 :(得分:2)
set -e
使脚本在任何命令的非零退出状态下失败。 set +e
删除了该设置。
答案 1 :(得分:2)
有很多方法可以做到这一点。
例如,可以使用set自动停止"坏" RC;只需输入
即可set -e
在您的脚本之上。或者,你可以写一个" check_rc"功能;请参阅here了解一些起点。
或者,你从这开始:
check_error () {
if [ $RET == 0 ]; then
echo "DONE"
echo ""
else
echo "ERROR"
exit 1
fi
}
用于:
echo "some example command"
RET=$? ; check_error
如上所述;很多方法都可以做到这一点。
答案 2 :(得分:2)
可以使用set -e
but it's not without it's own pitfalls。另一个人可以挽救错误:
command || exit 1
你的if
- 陈述可以写得更简洁:
if command; then
以上内容与:
相同command
if test "$?" -eq 0; then
答案 3 :(得分:1)
最好的办法是,只要观察到任何非零返回码,就使用set -e
来终止脚本。或者,您可以编写一个函数来处理错误陷阱并在每个命令之后调用它,这将减少if...else
部分,您可以在退出之前print
任何消息。
trap errorsRead ERR;
function errorsRead() {
echo "Some none-zero return code observed..";
exit 1;
}
somecommand #command of your need
errorsRead # calling trap handling function
答案 4 :(得分:0)
你可以做这个装置:
wget http://file1.com || exit 1
如果命令返回非零(失败)结果,这将终止带有错误代码1的脚本。