【问题标题】:A simple 'if' statement [duplicate]一个简单的“if”语句[重复]
【发布时间】:2012-05-18 03:50:43
【问题描述】:

我的问题可以简化为使以下脚本工作(需要一个命令行参数):

#!/bin/bash
if ["$1" == "0"]; then
    echo "good"
else
    echo "bad"
fi

当我运行 script 0 时,这应该会打印出 good,但我无法做到。我尝试了数字周围的各种引号组合,我尝试了 =、== 和 -eq。那么... bash,它是如何工作的?

【问题讨论】:

    标签: bash if-statement


    【解决方案1】:

    [ 实际上是一个命令。执行ls /bin/[ls /usr/bin/[。你会看到它实际上是一个可执行文件。

    [...] 来自旧的 Bourne shell 时代。 if 命令执行该语句,如果该语句的退出代码为零,则该语句被视为 true 并执行 if 子句。如果退出代码不为零,则执行 else 子句(如果存在)。

    试试这些:

    $ date
    Fri May 18 00:04:03 EDT 2012
    echo $?   #Prints the exit code of the date command
    0
    
    $ date -Q  #Shouldn't work, I hope...
    date: illegal option -- q
    usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
        [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
    $ echo $?    #Exit code for the date command
    1
    

    您可以看到date 是一个有效命令并返回退出代码0($? 的值),但date -Q 无效,并返回退出代码1。

    现在让我们在if 语句中尝试一下:

    if date
    then
       echo "I've successfully printed out the date!"
    else
       echo "I made a mistake in the command"
    fi
    

    现在试试这个:

    if date -q
    then
       echo "I've successfully printed out the date!"
    else
       echo "I made a mistake in the command"
    fi
    

    最初,[...]test 命令的别名。以下是等价的:

    if test -f /bin/ls    #Does a file called /bin/ls exist?
    then
       echo "There's a /bin/ls file"
    fi
    

    if [ -f /bin/ls ]
    then
       echo "There's a /bin/ls file"
    fi
    

    这就是为什么在[] 周围放置空格非常重要。因为这些实际上是命令。在 BASH 中,shell 内置,但它们是命令。这也是为什么所有测试参数(如-f-z-eq)都以破折号为前缀的原因。它们最初是test 命令的参数。

    【讨论】:

    • 哇,感谢您提供的信息丰富的答案。我以为这只是 bash 语法的一部分。
    • 它是 bash 语法的一部分,但不是 bash 语法的一部分。这是一个内置命令,例如 readecho。这些现在也内置在 shell 中,但可执行文件仍然存在于 /bin/usr/bin 目录中。
    • 它现在是 bash 中的内置命令,但它仍然只是 test 的同义词,而不是语法。
    【解决方案2】:

    在括号和参数之间使用空格

    $ cat x
    #!/bin/bash
    if [ "$1" == "0" ]; then
        echo "good"
    else
        echo "bad"
    fi
    
    $ bash x 0
    good
    

    【讨论】:

      【解决方案3】:

      使用双括号进行算术比较,则不用担心引号和空格,例如:

      #!/bin/bash 
      if (($1 == 0)); then 
          echo "good" 
      else 
          echo "bad" 
      fi 
      

      一般规则:对算术使用(( )),对文本和模式使用[[ ]]
      正如其他人所说,[ 是旧的 Bourne shell 语法,几乎没有理由再使用它了。

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 2011-02-17
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2020-08-15
        • 1970-01-01
        相关资源
        最近更新 更多