如何逐行执行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

【讨论】:

赞成。尽管可能会更加强调明确检查$? 几乎是不必要的,而ifwhile 等控制语句已经这样做了,而这正是它们的目的。【参考方案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脚本? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用for循环bash脚本逐行读取文件[重复]

如何让 python 脚本作为可执行文件运行? [复制]

如何包含具有相对路径的 bash 脚本? [复制]

如何在 bash 脚本中超时? [复制]

如何在 bash 脚本中提示用户进行确认? [复制]

一个简单的 if/else bash 脚本,它对用户的是/否输入做出反应? [复制]