如果任何一个脚本失败,如何退出运行?

时间:2017-05-03 14:06:44

标签: bash shell unix sh ksh

我正在运行club.sh

在club.sh脚本中,我在脚本下面运行。

test1.sh test2.sh test3.sh

我关心的是它应该逐个运行,如果test1失败,它将不会运行test2.sh,如果test2.sh失败,它将不会运行test3.sh

我们怎么检查?任何人都可以提出任何有用的建议。

谢谢,

4 个答案:

答案 0 :(得分:4)

两种方法 -

首先,您可以检查每个内部脚本的退出代码(test1.sh,test2.sh,...)并决定是否继续相应 -

$?将返回上一个命令的退出代码。如果脚本退出而没有错误,它将为0(零)。任何不是0的东西都可以被视为失败。所以你可以这样 -

./test1.sh # execute script
if [[ $? != 0 ]]; then exit; fi # check return value, exit if not 0

或者,您可以使用&& bash运算符,该运算符仅在前一个命令通过时执行后续命令 -

./test1.sh && ./test2.sh && test3.sh 

仅当test1.sh返回退出代码0(零)时才会执行test2.shtest3.sh也是如此。

如果您需要在执行脚本之间进行一些日志记录或清理,第一种方法是好的,但是如果您只关心如果发生故障则执行不应该继续,那么&&方法就是它们我建议的方式。

Here is a related post dealing with the meaning behind &&

答案 1 :(得分:1)

执行第一个命令/脚本的返回值存储在$?中,因此使用此值可以检查命令是否已成功执行。

试试这个:

bash test1.sh
if [ $? -eq 0 ]; then # if script succeeded
    bash test2.sh
else
    echo "script failed"
fi

答案 2 :(得分:1)

如果您想在命令失败时退出脚本,只需在脚本set -e的开头添加。

#!/bin/bash

set -e

echo hello
ls /root/lalala
echo world

否则,您有两种选择。

第一个是使用&&。例如:

echo hello && ls /some_inexistant_directory && echo world

第二个是检查每个命令后的返回值:

#!/bin/bash

echo toto
if [ "$?" != "0" ]; then
    exit 1
fi

ls /root
if [ "$?" != "0" ]; then
    exit 1
fi

echo world
if [ "$?" != "0" ]; then
    exit 1
fi

答案 3 :(得分:0)

你只需要将下面的内容放在脚本的乞讨处:

#!/bin/bash -e