Bash 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

对于shell脚本来说,这是一个全新的概念。我正在努力做到以下几点:

#!/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