Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何逐行执行bash脚本?_Bash - Fatal编程技术网

如何逐行执行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 但是脚本变得臃肿

我想逐行执行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
但是脚本变得臃肿


有更好的方法吗?

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