如何逐行执行bash脚本? [复制]
Posted
技术标签:
【中文标题】如何逐行执行bash脚本? [复制]【英文标题】:How to execute a bash script line by line? [duplicate] 【发布时间】:2017-01-14 20:44:02 【问题描述】:#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
但是脚本变得臃肿。
有没有更好的方法?
【问题讨论】:
tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html 这与“标记重复”不太一样 - 但正因为如此,我无法添加自己的(格式正确)答案! 我真的很惊讶没有人想出一个“陷阱调试”解决方案。你可以用$?获取 wget 退出值,$BASH_COMMAND 检查它是否是 wget,$BASH_LINENO 告诉您哪个 wget。 【参考方案1】:可以使用set -e
but it's not without it's own pitfalls。另一种方法可以解决错误:
command || exit 1
你的if
-statement 可以写得不那么冗长:
if command; then
以上同:
command
if test "$?" -eq 0; then
【讨论】:
赞成。尽管可能会更加强调明确检查$?
几乎是不必要的,而if
和while
等控制语句已经这样做了,而这正是它们的目的。【参考方案2】:
set -e
使脚本在任何命令的非零退出状态下失败。 set +e
删除设置。
【讨论】:
如果我使用这种方法,我怎么知道哪一行(在原始脚本中)导致了错误?我想打印那行。 @J.Joe ,您可以使用set -x
来实现这一点。所以set -ex
应该这样做。
@choroba 实际上,我认为更好的方法是2>&1 | tee -a log
,这样您就可以随时查看日志。
@J.Joe 也看看***.com/questions/10743026/…。【参考方案3】:
有很多方法可以做到这一点。
例如可以使用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
如前所述;有很多方法可以做到这一点。
【讨论】:
如果我使用这种方法,我怎么知道是哪一行(在原始脚本中)导致了错误?我想打印那行。【参考方案4】:最好的办法是在观察到任何非零返回码时立即使用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
【讨论】:
【参考方案5】:你可以做这个装置:
wget http://file1.com || exit 1
如果命令返回非零(失败)结果,这将终止脚本并返回错误代码 1。
【讨论】:
以上是关于如何逐行执行bash脚本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章