在Bash脚本中,如果出现某种情况,怎样才能退出整个脚本?
我在Bash编写脚本来testing一些代码。 然而,如果编译代码首先失败,运行testing似乎很愚蠢,在这种情况下,我将放弃testing。
有没有一种方法,我可以做到这一点,而不包括在一个while循环内的整个脚本,并使用rest? 像邓敦顿那样的东西?
试试这个声明:
exit 1
用适当的错误代码replace1
。 另请参见具有特殊含义的退出代码 。
使用set -e
#!/bin/bash set -e /bin/command-that-fails /bin/command-that-fails2
该脚本将在第一行失败后返回(返回非零的退出码)。 在这种情况下, command-that-fails2将不会运行。
如果您要检查每个命令的返回状态,您的脚本将如下所示:
#!/bin/bash # I'm assuming you're using make cd /project-dir make if [[ $? -ne 0 ]] ; then exit 1 fi cd /project-dir2 make if [[ $? -ne 0 ]] ; then exit 1 fi
设置-e它看起来像:
#!/bin/bash set -e cd /project-dir make cd /project-dir2 make
任何失败的命令将导致整个脚本失败,并返回一个退出状态,你可以检查$? 。 如果你的脚本很长,或者你正在构build很多东西,那么如果你在任何地方添加返回状态检查,那么它将变得非常难看。
SysOps的坏驴子曾经教过我三爪技术:
yell() { echo "$0: $*" >&2; } die() { yell "$*"; exit 111; } try() { "$@" || die "cannot $*"; }
这些function是* NIX操作系统和shell风味强劲。 把它们放在脚本的开头(bash或其他), try()
你的语句和代码。
说明
(基于飞羊评论)。
-
yell
:打印脚本名称和所有参数stderr
:-
$0
是脚本的path; -
$*
都是参数。 -
>&2
表示>
将stdoutredirect到&pipe2
。 pipe道1
将自己stdout
。
-
-
die
和yell
,但是以非0退出状态退出 ,这意味着“失败”。 -
try
使用||
(布尔OR
),如果左边的没有失败,它只评估右边。-
$@
是所有的论点,但不同 。
-
希望解释一切。
如果您将使用source
调用脚本,则可以使用return <x>
,其中<x>
将成为脚本退出状态(对于错误或错误使用非零值)。 当您input脚本时,这也将按预期工作。 如果您调用可执行脚本(即直接使用其文件名),则返回语句将导致抱怨(错误消息“return:只能从函数或源脚本返回”)。
如果使用exit <x>
,那么当使用source
调用脚本时,将导致退出启动脚本的shell,但可执行脚本将直接运行正常。
要在同一个脚本中处理这两种情况,可以使用
return <x> 2> /dev/null || exit <x>
这将处理任何适合的调用。
注意: <x>
应该只是一个数字。
我经常包含一个名为run()的函数来处理错误。 我想要做的每个调用都被传递给这个函数,这样整个脚本就会在失败时退出。 与set -e解决scheme相比,这样做的好处是脚本不会在线路出现故障时自动退出,并可以告诉您问题是什么。 在以下示例中,由于脚本在调用false时退出,因此不执行第三行。
function run() { cmd_output=$(eval $1) return_value=$? if [ $return_value != 0 ]; then echo "Command $1 failed" exit -1 else echo "output: $cmd_output" echo "Command succeeded." fi return $return_value } run "date" run "false" run "date"
而不是if
构build,你可以利用短路评估 :
#!/usr/bin/env bash echo $[1+1] echo $[2/0] # division by 0 but execution of script proceeds echo $[3+1] (echo $[4/0]) || exit $? # script halted with code 1 returned from `echo` echo $[5+1]
注意由于交替操作符的优先级而需要的那对括号。 $?
是设置为退出最近调用的命令的代码的特殊variables。