【问题标题】:How to execute a bash script line by line? [duplicate]如何逐行执行bash脚本? [复制]
【发布时间】: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

但是脚本变得臃肿。

有没有更好的方法?

【问题讨论】:

  • 这与“标记重复”不太一样 - 但正因为如此,我无法添加自己的(格式正确)答案!
  • 我真的很惊讶没有人想出一个“陷阱调试”解决方案。你可以用$?获取 wget 退出值,$BASH_COMMAND 检查它是否是 wget,$BASH_LINENO 告诉您哪个 wget。

标签: bash


【解决方案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

【讨论】:

  • 赞成。尽管可能会更加强调明确检查$? 几乎是不必要的,而ifwhile 等控制语句已经这样做了,而这正是它们的目的。
【解决方案2】:

set -e 使脚本在任何命令的非零退出状态下失败。 set +e 删除设置。

【讨论】:

  • 如果我使用这种方法,我怎么知道哪一行(在原始脚本中)导致了错误?我想打印那行。
  • @J.Joe ,您可以使用set -x 来实现这一点。所以set -ex 应该这样做。
  • @choroba 实际上,我认为更好的方法是2>&1 | tee -a log,这样您就可以随时查看日志。
【解决方案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。

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 2013-07-10
      • 2023-03-17
      • 1970-01-01
      • 2020-03-27
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多