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

Bash 如果任何一个脚本失败,如何退出运行?,bash,shell,unix,sh,ksh,Bash,Shell,Unix,Sh,Ksh,我在跑步俱乐部 在club.sh脚本中,我在脚本下面运行 test1.sh test2.sh test3.sh 我关心的是它应该一个接一个地运行,如果test1失败,它将不会运行test2.sh,如果test2.sh失败,它将不会运行test3.sh 我们怎么检查?有人能提出什么建议吗?这会很有帮助的 谢谢,有两种方法- 首先,您可以检查每个内部脚本(test1.sh、test2.sh等)的退出代码,并决定是否相应地继续- $?将返回上一个命令的退出代码。如果脚本在没有错误的情况下退出,它将是0

我在跑步俱乐部

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

test1.sh test2.sh test3.sh

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

我们怎么检查?有人能提出什么建议吗?这会很有帮助的

谢谢,

有两种方法-

首先,您可以检查每个内部脚本(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.sh
才会执行,而
test3.sh
也是如此


如果您需要在执行脚本之间执行一些日志记录或清理,那么第一种方法是很好的,但是如果您只关心如果出现故障,执行不应该继续,那么
&&
方法就是我推荐的方法


两种方法-

首先,您可以检查每个内部脚本(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.sh
才会执行,而
test3.sh
也是如此


如果您需要在执行脚本之间执行一些日志记录或清理,那么第一种方法是很好的,但是如果您只关心如果出现故障,执行不应该继续,那么
&&
方法就是我推荐的方法



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

试试这个:

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

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

试试这个:

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

如果希望在命令失败时退出脚本,只需在脚本的开头添加
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

如果希望在命令失败时退出脚本,只需在脚本的开头添加
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

你只需在剧本的乞讨处写下以下内容:

#!/bin/bash -e 

你只需在剧本的乞讨处写下以下内容:

#!/bin/bash -e 

您可以在shebang之后添加
set-e
作为行,以便在出现任何问题时立即退出脚本。试着运行
help set
@MarkSetchell我认为
set-e
对于这个场景来说可能有点太苛刻了(根据我们所掌握的信息)。如果提前终止的唯一条件是
test*
脚本失败,则应检查其退出代码,而不是在出现任何错误时终止
club.sh
。您可以在shebang之后添加
set-e
,以便在出现任何错误时立即退出脚本。试着运行
help set
@MarkSetchell我认为
set-e
对于这个场景来说可能有点太苛刻了(根据我们所掌握的信息)。如果提前终止的唯一条件是
test*
脚本失败,则应检查其退出代码,而不是在出现任何错误时终止
club.sh
。请查看。使用
set-e
将在出现任何错误时终止
club.sh
,这不仅仅是因为
test*
脚本中的错误。@Lix我知道,我只是在这里列出选项。请查看。使用
set-e
将在出现任何错误时终止
club.sh
——不仅仅是因为
test*
脚本中的错误。@Lix我知道,我只是在这里列出选项。退出代码可以直接使用,而无需测试
/test2.sh | |退出2
。在我看来,它更容易阅读。而且,没有人想在一行中添加一个
回音“somthing important”
退出代码可以直接使用,而无需测试
/test2.sh | |退出2
。在我看来,它更容易阅读。而且,没有人愿意在一行中添加一个
回音“somthing important”