Bash条件基于退出命令代码

时间:2018-04-16 05:06:59

标签: bash shell process command exit-code

在Bash中,我想要一个基于运行命令的退出代码的if语句。例如:

#!/bin/bash

if [ ./success.sh ]; then
    echo "First: success!"
else
    echo "First: failure!"
fi

if [ ./failure.sh ]; then
    echo "Second: success!"
else
    echo "Second: failure!"
fi

success.sh

#!/bin/bash

exit 0

failure.sh

#!/bin/bash

exit 1

这应打印出来:

First: success!
Second: failure!

我将如何实现这一目标?谢谢!

2 个答案:

答案 0 :(得分:5)

只需删除括号:

#!/bin/bash

if ./success.sh; then
    echo "First: success!"
else
    echo "First: failure!"
fi

if ./failure.sh; then
    echo "Second: success!"
else
    echo "Second: failure!"
fi

说明:ifthen之间的事情是命令(或一系列命令),其退出状态用于确定是否运行then子句或else子句。这正是你想要的。

那么为什么人们在if陈述中使用括号?这是因为通常你想根据某些条件表达式(if等于"$a"来决定运行"$b"的哪个分支,是否存在某个文件等)。 [实际上是一个命令,它将其参数解析为条件表达式(忽略最终的]),然后根据条件是真还是假而成功或失败退出。实质上,[ ]用作适配器,允许您在if语句中使用条件表达式而不是命令成功/失败。在您的情况下,您想要成功/失败而不是条件表达式,所以不要使用适配器。

顺便说一下,您有时也会看到if [[ some expression ]]; thenif (( some expression )); then[[ ]](( ))是bash语法中内置的条件表达式(与[不同,这是一个命令)。 [[ ]]本质上是[ ]的更好版本(清除了一些语法怪异并添加了一些功能),(( ))是一个类似于算术表达式的构造。

BTW2您将在脚本中看到的另一件事是通过检查特殊参数$?来测试退出状态,该参数给出了最后一个命令的退出状态。它看起来像这样:

somecommand
if [ $? -eq 0 ]; then
    echo "Somecommand: success!"
else
    echo "Somecommand: failure!"
fi

我真的认为这个货物崇拜节目。人们习惯于在[ ]语句中看到if条件表达式,而这个成语将成功测试以条件表达式的形式出现。但是让我来看看它是如何工作的:它接受命令的退出状态,将其置于条件表达式中,让[ ]评估并将其右转回到退出状态所以if可以使用它。整个过程是不必要的;只需将命令直接放在if语句中。

答案 1 :(得分:0)

除了接受的答案外,请注意,您有时可能希望保留退出状态以供以后使用。在这种情况下,您可以将其保存到变量中,然后测试该变量。

以下是使用您的命令和Bash算法(( ))命令进行测试的示例:

#!/bin/bash

./success.sh
es1=$?

echo "exit status = $es1"
if (( es1 == 0 )); then
    echo "First: success! (es1 = $es1)"
else
    echo "First: failure! (es1 = $es1)"
fi

./failure.sh
es2=$?

echo "exit status = $es2"
if (( es2 > 0 )); then
    echo "Second: failure! ($es2 is greater than 0)"
else
    echo "Second: success!"
fi