Bash 条件基于命令的退出代码
Bash conditional based on exit code of command
在 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!
我该如何实现?谢谢!
只需删除括号:
#!/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
说明:if
和then
之间的是一条命令(或一系列命令),其退出状态用于判断是否运行 then
子句,或 else
子句。这正是您想要的。
那么为什么人们在 if
语句中使用方括号?这是因为通常你想根据一些条件表达式来决定 if
到 运行 的哪个分支("$a"
是否等于 "$b"
,某个文件是否存在等) . [
实际上是一个命令,它将其参数解析为条件表达式(忽略最后的 ]
),然后根据条件是真还是假以成功或失败退出。本质上,[ ]
用作适配器,允许您在 if
语句中使用条件表达式而不是命令 success/failure。在你的情况下,你 想要 success/failure 不是条件表达式,所以不要使用适配器。
顺便说一句,您有时还会看到 if [[ some expression ]]; then
和 if (( some expression )); then
。 [[ ]]
和 (( ))
是内置于 bash 语法中的条件表达式(不同于 [
,它是一个命令)。 [[ ]]
本质上是 [ ]
的一个更好的版本(清理了一些奇怪的语法并添加了一些功能),而 (( ))
是一个有点类似的结构,它执行算术表达式。
BTW2 您将在脚本中看到的另一件事是通过检查特殊参数 $?
来测试退出状态,它给出了最后一个命令的退出状态。它看起来像这样:
somecommand
if [ $? -eq 0 ]; then
echo "Somecommand: success!"
else
echo "Somecommand: failure!"
fi
我真的在考虑这种货物崇拜编程。人们习惯于在if
语句中看到[ ]
条件表达式,这个成语将成功测试放在条件表达式的形式中。但是让我 运行 了解它是如何工作的:它获取命令的退出状态,将其放入条件表达式中,让 [ ]
评估 并将其转回退出status 所以 if
可以使用它。整个rigamarole是不必要的;只需将命令直接放在 if
语句中即可。
除了已接受的答案外,请注意,您有时可能希望保留退出状态以备后用。在这种情况下,您可以将其保存到一个变量中,然后测试该变量。
这是一个使用您的命令和 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
在 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!
我该如何实现?谢谢!
只需删除括号:
#!/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
说明:if
和then
之间的是一条命令(或一系列命令),其退出状态用于判断是否运行 then
子句,或 else
子句。这正是您想要的。
那么为什么人们在 if
语句中使用方括号?这是因为通常你想根据一些条件表达式来决定 if
到 运行 的哪个分支("$a"
是否等于 "$b"
,某个文件是否存在等) . [
实际上是一个命令,它将其参数解析为条件表达式(忽略最后的 ]
),然后根据条件是真还是假以成功或失败退出。本质上,[ ]
用作适配器,允许您在 if
语句中使用条件表达式而不是命令 success/failure。在你的情况下,你 想要 success/failure 不是条件表达式,所以不要使用适配器。
顺便说一句,您有时还会看到 if [[ some expression ]]; then
和 if (( some expression )); then
。 [[ ]]
和 (( ))
是内置于 bash 语法中的条件表达式(不同于 [
,它是一个命令)。 [[ ]]
本质上是 [ ]
的一个更好的版本(清理了一些奇怪的语法并添加了一些功能),而 (( ))
是一个有点类似的结构,它执行算术表达式。
BTW2 您将在脚本中看到的另一件事是通过检查特殊参数 $?
来测试退出状态,它给出了最后一个命令的退出状态。它看起来像这样:
somecommand
if [ $? -eq 0 ]; then
echo "Somecommand: success!"
else
echo "Somecommand: failure!"
fi
我真的在考虑这种货物崇拜编程。人们习惯于在if
语句中看到[ ]
条件表达式,这个成语将成功测试放在条件表达式的形式中。但是让我 运行 了解它是如何工作的:它获取命令的退出状态,将其放入条件表达式中,让 [ ]
评估 并将其转回退出status 所以 if
可以使用它。整个rigamarole是不必要的;只需将命令直接放在 if
语句中即可。
除了已接受的答案外,请注意,您有时可能希望保留退出状态以备后用。在这种情况下,您可以将其保存到一个变量中,然后测试该变量。
这是一个使用您的命令和 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