很多sh代码看起来像:
$cmd if [ $? = 0 ]; then $cmd2; fi
而不是:
if $cmd; then $cmd2; fi
我通常认为人们使用前者只是因为他们不知道后者的语法是有效的,但我想知道是否还有另一个原因(尽管我想到的唯一可能性是可移植性)。是否有理由更愿意明确引用$ {?}?。
答案 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)