shell 脚本中的比较

Comparisons in shell scripting

我真的很困惑。我想,我可以写一个 return 代码比较,如下所示。哪个更好?为什么会这样?

RC=$?

if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then

还有更多...

如果 RC="A" -- 字符串怎么办?

如果您在 Bash 中,它不会按 类型 分隔其变量,但是 ... return code 是数值,所以我将下注:

rc=$?

if (( ! rc )); then
  # rc == 0
  Do something
fi

原因:保持与预期相关的一致性 type

检查:http://tldp.org/LDP/abs/html/untyped.html

None 以上。在绝大多数情况下,您希望直接从 if 中检查退出代码。任何看起来像

的代码
command
RC=$?
if [ $RC == 0 ]; then

写得更优雅、更健壮、更地道

if command; then

除非您特别需要检查结果代码的精确非零值。

为了单独解决关于使用哪个比较运算符的问题,唯一完全可移植的变体是 [=。这个遗留 Bourne shell 运算符的语法不支持 == 的相等性,所以这是错误的(尽管一些 shell 允许它作为语法安全网)。 -eq 运算符比较数字相等,而 = 执行字符串比较。

在现代的shell中,[[((都是可行的,取决于你是否更关心字符串比较(这就是[[有意义的地方)或算术(这是 (( 的域——如果比较涉及对数字的一些实际计算,则特别有用;但它绝对是更边缘的选择,因为它对字符串比较根本没有用)。 [[ 还支持模式匹配,让你不再局限于静态字符串比较;与 [ 不同,它需要双等号来进行字符串相等比较。它解决了 [ 的一些棘手问题,包括但不限于使用破折号开头的未引号变量和参数的正确行为。

带单括号的替代方案根本无法满足您的要求。它尝试将 运行 $RC 作为子 shell.

中的命令