如何逐行执行bash脚本?
我想逐行执行bash脚本,测试每次执行的退出代码($?),并确定是否继续: 这基本上意味着我需要在原始脚本的每一行下面添加以下脚本:如何逐行执行bash脚本?,bash,Bash,我想逐行执行bash脚本,测试每次执行的退出代码($?),并确定是否继续: 这基本上意味着我需要在原始脚本的每一行下面添加以下脚本: #Example Script wget http://file1.com cd /dir wget http://file2.com wget http://file3.com 原始脚本变成: if test $? -eq 0 then echo "No error" else echo "ERROR" exit fi 但是脚本变得臃肿
#Example Script
wget http://file1.com
cd /dir
wget http://file2.com
wget http://file3.com
原始脚本变成:
if test $? -eq 0
then
echo "No error"
else
echo "ERROR"
exit
fi
但是脚本变得臃肿
有更好的方法吗?
set-e
使脚本在任何命令的非零退出状态下失败set+e
删除设置。有很多方法可以做到这一点
例如,可以使用,以便在“坏”rc上自动停止;简单地说
#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
在你的脚本之上。或者,您可以编写一个“check_rc”函数;有关一些起点,请参见
或者,您可以从以下内容开始:
set -e
用于:
check_error () {
if [ $RET == 0 ]; then
echo "DONE"
echo ""
else
echo "ERROR"
exit 1
fi
}
如前所述;有很多方法可以做到这一点。您可以使用以下装置:
echo "some example command"
RET=$? ; check_error
如果命令返回非零(失败)结果,这将终止脚本,错误代码为1。可以使用。备选方案之一可以在出现错误时进行纾困:
wget http://file1.com || exit 1
您的if
-语句可以写得不那么冗长:
command || exit 1
以上内容同:
if command; then
最好的办法是使用
set-e
在观察到任何非零返回代码时立即终止脚本。或者,您可以编写一个函数来处理错误陷阱,并在每个命令后调用它,这将减少if…else
部分,并且您可以在退出之前打印任何消息
command
if test "$?" -eq 0; then
这与“标记的副本”不完全相同,但由于它,我无法添加自己的(正确格式的)答案!事实上,我很惊讶没有人提出“陷阱调试”解决方案。您可以使用$?要获取wget exit值,$BASH_命令检查它是否为wget,$BASH_LINENO告诉您是哪个wget。如果使用此方法,我如何知道是哪一行(在原始脚本中)导致了错误?我想打印那一行。如果我使用这种方法,我怎么知道是哪一行(在原始脚本中)导致了错误?我想打印这行。@J.Joe,您可以使用
set-x
来实现这一点。所以set-ex
应该可以。@choroba事实上,我认为更好的方法是2>&1 | tee-a log
,这样你可以随时查看日志。@J.Joe还可以查看.Upvoted。尽管可能更强调的是,明确地检查$?
几乎是不必要的,而像if
和while
这样的控制语句已经这样做了,这正是它们的目的。
trap errorsRead ERR;
function errorsRead() {
echo "Some none-zero return code observed..";
exit 1;
}
somecommand #command of your need
errorsRead # calling trap handling function