Bash shell脚本中的捕获失败
对于shell脚本来说,这是一个全新的概念。我正在努力做到以下几点:Bash shell脚本中的捕获失败,bash,shell,unix,Bash,Shell,Unix,对于shell脚本来说,这是一个全新的概念。我正在努力做到以下几点: #!/bin/bash unzip myfile.zip #do stuff if unzip successful 我知道我可以用&&将命令链接在一起,但是有相当多的块,它不太容易维护。您可以使用$?。它返回: -如果命令成功执行,则为0。 - !如果命令不成功,则返回0 所以你可以 #!/bin/bash unzip myfile.zip if [ "$?" -eq 0 ]; then #do stuff
#!/bin/bash
unzip myfile.zip
#do stuff if unzip successful
我知道我可以用
&&
将命令链接在一起,但是有相当多的块,它不太容易维护。您可以使用$?
。它返回:-如果命令成功执行,则为0。
- !如果命令不成功,则返回0 所以你可以
#!/bin/bash
unzip myfile.zip
if [ "$?" -eq 0 ]; then
#do stuff on unzip successful
fi
试验
变量
$?
包含上一个命令的退出状态。(大多数)命令的成功退出状态(通常)为0,因此只需检查该状态
#!/bin/bash
unzip myfile.zip
if [ $? == 0 ]
then
# Do something
fi
您可以在测试中明确使用命令的退出状态:
if ! unzip myfile.zip &> /dev/null; then
# handle error
fi
如果希望shell检查已执行命令的结果,并在返回非零值时停止解释,则可以添加
set-e
,这意味着如果命令以非零状态退出,则立即退出。我经常在脚本中使用此方法
#!/bin/sh
set -e
# here goes the rest
这基本上是正确的。大多数进程在成功时返回
0
,在失败时返回非零。它不一定是1
。这是可行的,但并不完全正确<代码>$?包含最近执行的命令的退出状态。这取决于命令,在unzip
命令的情况下,有17个可能的返回值。有关退出状态的信息通常可以在命令的手册页中找到。[$?]&&echo“error!”
将回显错误
,即使$?
为0
。它测试字符串是否为空,而不是字符串是否为非零。@CharlesDuffy mm,true。自从我写这篇文章以来,已经花了很多时间,但是我想[“$?”-eq 0]
是一条路吗?如果解压缩myfile.zip;然后
会更好,但是是的,如果你打算在事后进行比较,你的上述评论是对现在答案的改进。不可能重复,这不是重复,我很惊讶有人会这么认为。这个问题是关于基于任何不成功的语句中止整个脚本,这个问题是关于在特定语句不成功时退出。您说的是-e
,但在您的示例中使用的是-x
。另外,你可以把它放在你的shebang:#/bin/sh-e
。根据定义,命令成功的条件是退出状态为零。@williampersell我确信有人有一个定义说命令成功的条件是退出状态为0,但这是错误的。这是不可能的,因为“成功”是主观的,并不总是布尔值。退出状态为0表示仅满足条件。例如,grep
如果找到一个模式,则返回0,如果没有,则返回1。退出状态1表示它已成功执行,但未找到模式。添加-q
选项,即使出现错误,它也会返回0。相反,find
返回0,即使它还没有找到它的模式。如果解压缩myfile.zip,为什么要这样做而不是;然后:“做点什么”;fi
?通过$?
进行解耦只会增加潜在的bug——在解压
和if
之间添加一个回音
,突然$?
反映日志语句的退出状态,而不是解压命令。@MildFuzz/dev/null
是位桶,你可以将任何你喜欢的东西重定向到它,它就会被扔掉。2> &1告诉它将stderr指向stdout。
#!/bin/sh
set -e
# here goes the rest