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