如何逐行执行bash脚本?

时间:2016-09-07 08:42:01

标签: bash

#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

但剧本变得臃肿。

有更好的方法吗?

5 个答案:

答案 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的脚本。