这是最佳实践的一个简单问题:我应该使用哪个?
选项1
ping -c1 "$host"
if [[ $? -eq 0 ]] ; then
command
else
command
fi
选项2
if ping -c1 "$host" ; then
command
else
command
fi
我知道这是一个简单的命令,但如果它变大,差异可能会很大。
答案1
这是一个偏好问题,但如果您打算添加一个,第二种形式可能会更安全set -e
:此形式仍将按预期工作,而使用第一种形式,如果失败,脚本将立即结束ping
(以非零退出状态返回)。
注意:运算符是-eq
,不是eq
。
答案2
当你只关心成功与失败的区别时,选项2只是一个选项。如果您需要区分不同的非零退出状态,则选项 1 是必要的。
some-command arg1 arg2
exit_status=$?
if [[ $exit_status -eq 0 ]]; then
# ...
elif [[ $exit_status -eq 1 ]]; then
# ...
elif [[ $exit status -eq 42 ]]; then
# ...
else
# ...
fi
(您需要另存$?
为,exit_status
因为$?
将由第一个命令重置[[ ... ]]
;如果失败,第一个命令elif
将不会再次测试相同的值$?
。)
嗯,不完全是必要的。第三种选择是使用语句,如果您不需要再次引用其值,则case
可以消除保存的需要。$?
some-command arg1 arg2
case $? in
0) # ...
;;
1) # ...
;;
42) # ...
;;
*) # ...
;;
esac
答案3
您可以使用以下 Bash 惯用法,它可能看起来难以理解,但在实践中很常见。
ping -c1 "$host" && command_success || command_failure