代码之家  ›  专栏  ›  技术社区  ›  William Pursell

为什么引用$?明确地

  •  1
  • William Pursell  · 技术社区  · 14 年前

    很多sh代码看起来像:

    $cmd
    if [ $? = 0 ]; then $cmd2; fi
    

    而不是:

    if $cmd; then $cmd2; fi
    

    我通常认为人们使用前者仅仅是因为他们不知道后者的语法是有效的,但是我想知道是否还有其他原因(尽管我想到的唯一可能性是可移植性)。是否有任何理由更喜欢显式引用$?}?.

    4 回复  |  直到 13 年前
        1
  •  5
  •   Jens    13 年前

    你必须参考 $? 如果您真的想为某件事情使用错误代码(日志记录、处理预期错误等)。对于您提到的特定场景,第二个 if 构造既清晰又简短,我看没有理由不使用它。

        2
  •  2
  •   Jonathan Leffler    14 年前

    在我看来,因为很多人没有意识到你可以像你一样或多或少地测试命令的状态。同样,人们也没有意识到你可以写:

    if cmd1
       cmd2
       cmd3
    then
        ...do this after executing cmd1, cmd2 and cmd3, but ...
        ...only if cmd3 exits with with status 0!
    fi
    

    您还可以将代码简化为(以简洁为代价):

    cmd1 && cmd2
    

    (我看到@shin在评论中提到了这一点,我已经投了赞成票)。

    我还看到很多“bourne”shell代码使用:

    if ( ... )
    then ...
    fi
    

    有时这是合适的——但最常见的情况是,C shell程序员编写的代码没有意识到这个符号意味着在BourneShell和衍生工具中“运行子shell”——比如KornShell、符合POSIX的shell和bash。

        3
  •  1
  •   Joe    14 年前

    因为您测试的是命令的状态标志,而不是命令的输出。

    如果一个命令打印到stdout,但设置了一个标志,那么您将通过给出的两个示例得到不同的结果。

    在测试之后,我接受了纠正。我记得几年前在Solaris上遇到了一个问题(在ksh下?),但除了测试之外,我无法在当前可以访问的计算机下重新创建:

    如果 $cmd ]

        4
  •  1
  •   pixelbeat    14 年前

    是的,很多人不知道后一种更优雅的形式。 我之前在中提到过: http://www.pixelbeat.org/programming/shell_script_mistakes.html