IF [condition]&和IF之间有什么区别? bash中的[[condition]], - eq和==

时间:2016-12-10 04:57:56

标签: bash if-statement

下面的两个代码段之间是否存在差异?
    if [[ $a == "1" ]];then
       echo $a

    if [ $a == "1" ];then
       echo $a

此外,我在上述代码段中使用-eq代替==时有区别吗?

2 个答案:

答案 0 :(得分:4)

  • 至于你的主要问题:它是:Is [[ ]] preferable over [ ] in bash scripts?

    的副本
    • 您还可以找到(希望)全面讨论我this answer[ ... ][[ ... ]]之间的差异。
      简而言之:[[ ... ]]的解析更像是您在常规编程语言中所期望的,它实现了许多有用的扩展,但它不符合POSIX。
  • 至于“当我使用-eq代替==时会有区别吗?”:

    • ===,其Bash替代品,执行字符串比较。

      • 此外,仅在[[ ... ]] 内,如果===的RHS 未加引号,则将其解释为glob-style pattern 以匹配LHS;将[[ 'a' == '*' ]] && echo match[[ 'a' == * ]] && echo match
      • 进行对比
      • 请注意,如果您使用[ ... ](而非[[ ... ]])来实现POSIX合规性(可与/bin/sh一起使用),则应仅使用=,而不是{{1 }};虽然Bash也在==内接受==,但其他shell则不接受。{/ li>
    • [ ... ]执行整数比较

    • 存在其他字符串/数字运算符对(例如,-eq表示字母(字符串)小于... -lt在文本排序顺序上)。

  • Bash Conditional Expressions列出了您可以在<[ ... ]内使用的所有运算符(以及[[ ... ]],它实际上是test的别名)。

答案 1 :(得分:2)

在bash中,数字比较的处理方式与字符串比较不同

对于数字,

$var1 -eq $var2   // =
$var1 -gt $var2   // >
$var1 -ge $var2   // >=
$var1 -lt $var2   // <
$var1 -le $var2   // <=
$var1 -ne $var2   // !=

对于字符串

$str1 = $str2   // they are equal
str1 != str2    // not equal
str             // Returns True if str is not null.
-n str          // Returns True if the length of str is greater than zero.
-z str          // Returns True if the length of str is equal to zero.

请注意,==与=

相同

另请注意,在进行模式匹配时,=〜在双括号比较(这是[条件]与[[条件]]问题的来源)中的运算方式不同。这些比较/运算符都在http://www.tldp.org/LDP/abs/html/comparison-ops.html

解释