题
很多SH代码看起来像:
$cmd if [ $? = 0 ]; then $cmd2; fi
代替:
if $cmd; then $cmd2; fi
我通常假定人们使用前者,只是因为他们不知道的是,后者的语法是有效的,但我不知道是否还有另外一个原因(虽然我想到的唯一的可能就是便携性)。没有任何理由,更喜欢显式引用$ {?}?
解决方案
您必须引用$?
,如果你真的想使用的东西,错误代码(日志,处理预期错误等)。对于你提到的具体情况,第二if
结构既清晰,短,我看不出有什么理由不使用它。
其他提示
在我看来,因为很多人没有意识到,你可以测试命令或多或少为你做的状态。同样,人们还没有意识到,你可以写:
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
(I见@shin注意到这在注释中,我已经向上投票)。
我也看到很多“伯恩”壳代码,使用:
if ( ... )
then ...
fi
有时这是适当 - 但大多数情况下是东西,一个C壳程序员写到没有意识到符号的意思是“运行一个子壳”布赫纳壳和衍生物 - 如Korn外壳中,符合POSIX标准的壳,和击。
<德尔>因为正在测试的命令的状态标记,而不是从指令测试输出。德尔>
如果命令打印到stdout,而是设置一个标志,你会得到你所给出的两个例子得到不同的结果。
我站在纠正,测试它之后。我以为我记得在Solaris上运行了一个问题几年前,但我不能在机器下重新目前,我有访问除用于测试(ksh下):
如果[$cmd
]
有很多人不知道,后者更优雅的形式。 我之前提到这一点: http://www.pixelbeat.org/programming/shell_script_mistakes.html
不隶属于 StackOverflow