2015-09-09 130 views
1

我对理解这一点非常困惑。我认为,我可以写出如下给出的返回码比较。哪个更好?为什么要这样呢?shell脚本比较

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" - 字符串?

+0

在unix中搜索stirng和数字比较以及在unix中使用c语法进行比较 –

回答

6

以上都不是。在绝大多数情况下,您希望直接从if内检查退出代码。它看起来像

command 
RC=$? 
if [ $RC == 0 ]; then 

任何代码更优雅,强劲,地道书面

if command; then 

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

要单独提出有关要使用哪个比较运算符的问题,唯一完全便携的变体是[=。这个传统Bourne shell运算符的语法不支持==的相等性,所以这是错误的(尽管一些shell允许它作为语法安全网)。 -eq运算符比较数字相等性,而=执行字符串比较。

在现代炮弹,[[((都是可行的,这取决于你是否更关心的字符串比较(这是[[有道理)或算术(这是((域 - 如果比较涉及一些非常有用实际的数字计算;但它绝对是更多的边缘选择,因为它没有用于字符串比较)。 [[也支持模式匹配,所以你不仅限于静态字符串比较;与[不同,它需要字符串相等比较的双等号。它围绕着一些与[有关的棘手问题开展工作,包括但不限于正确的行为,不带引号的变量和以短划线开头的参数。

带有一个括号的替代方法完全不符合您的要求。它试图运行$RC作为子shell中的命令。

+0

Upvoted - 感谢您的努力。如果它是一个字符串呢? – SriniV

+0

命令'$?'的返回值从不是一个字符串。你可以使用'if [$? 'eq 0]'这些情况。另一种可能性是跳过关键字“if”,但我更愿意仅在少数情况下使用它:http:// unix。stackexchange.com/a/194926/57293 –

+0

很好的解释。 – Umer

1

如果你在Bash它不分离它的变量,但是......一个returncode是一个数值,所以我会打赌:

rc=$? 

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

原因:保持连贯性与预期的type有关系。

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

+0

你能解释我为什么在(())上下注吗?有什么好处? – SriniV

+0

个人品味@realspirituals,在答案中解释 – klashxx

+0

更新了问题。感谢迄今的努力 – SriniV