如何逐行执行bash脚本?

How to execute a bash script line by line?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
#Example Script
wget http://file1.com
cd /dir
wget http://file2.com
wget http://file3.com

我想一行一行地执行bash脚本并测试退出代码($?)并决定是否继续执行:

这基本上意味着我需要在原始脚本的每一行下面添加以下脚本:

1
2
3
4
5
6
7
if test $? -eq 0
then
    echo"No error"
else
   echo"ERROR"
   exit
fi

原稿变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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

但是脚本变得膨胀了。

有更好的方法吗?


一个人可以使用set -e,但它并非没有自己的陷阱。另一种方法是,在出现错误时采取补救措施:

1
command || exit 1

你的if声明可以写得不那么冗长:

1
if command; then

以上同:

1
2
command
if test"$?" -eq 0; then


有很多方法可以做到这一点。

例如,可以使用set在"bad"rc上自动停止;只需将

1
set -e

在你的剧本上面。或者,您可以编写一个"check_rc"函数;有关一些起点,请参见此处。

或者,从以下内容开始:

1
2
3
4
5
6
7
8
9
check_error () {
  if [ $RET == 0 ]; then
    echo"DONE"
    echo""
  else
    echo"ERROR"
    exit 1
  fi
}

用于:

1
2
echo"some example command"
RET=$? ; check_error

如前所述;很多方法可以做到这一点。


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


最好的办法是在观察到任何非零返回代码后立即使用set -e终止脚本。或者,您可以编写一个函数来处理错误陷阱,并在每个命令之后调用它,这将减少if...else部分,并且您可以在退出之前print任何消息。

1
2
3
4
5
6
7
8
9
10
trap errorsRead ERR;
function errorsRead() {

   echo"Some none-zero return code observed..";
   exit 1;
}


    somecommand #command of your need
    errorsRead  # calling trap handling function

你可以做这个装置:

1
wget http://file1.com || exit 1

如果命令返回非零(失败)结果,将终止脚本,错误代码为1。