我应该在条件中嵌入命令或测试其返回码吗?

我应该在条件中嵌入命令或测试其返回码吗?

这是最佳实践的一个简单问题:我应该使用哪个?

选项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

相关内容