为何参考$?明确地

时间:2009-12-22 17:04:19

标签: shell sh

很多sh代码看起来像:

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

而不是:

if $cmd; then $cmd2; fi

我通常认为人们使用前者只是因为他们不知道后者的语法是有效的,但我想知道是否还有另一个原因(尽管我想到的唯一可能性是可移植性)。是否有理由更愿意明确引用$ {?}?。

4 个答案:

答案 0 :(得分:5)

如果您确实想要使用错误代码(日志记录,处理预期错误等),则必须引用$?。对于您提到的特定场景,第二个if构造更清晰,更短,我认为没有理由不使用它。

答案 1 :(得分:2)

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

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程序员写的没有意识到符号意味着在Bourne shell和衍生产品中运行“子shell” - 比如Korn shell,符合POSIX的shell,和巴什。

答案 2 :(得分:1)

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

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

经过测试,我站了起来。我想我多年前在solaris上遇到过一个问题(在ksh下?),但是我无法在我目前可以访问的机器下重新创建,除了测试:

如果[$cmd]

答案 3 :(得分:1)

很多人不了解后者更优雅的形式。 我之前提到过: http://www.pixelbeat.org/programming/shell_script_mistakes.html