代码之家  ›  专栏  ›  技术社区  ›  user129393192

外壳字符串与整数比较

  •  1
  • user129393192  · 技术社区  · 3 年前

    我发现如果我有

    time='9'
    

    然后

    [ "$time" = 9 ]
    [ "$time" = '9' ]
    [ "$time" -eq 9 ]
    [ "$time" -eq '9' ]
    

    所有eval true。这是不寻常的,因为我习惯于引用描述字符串,而没有引用是整数,我曾想过 -eq 是整数比较,并且 = 是字符串。这里的解释是什么?

    我检查一下 zsh

    1 回复  |  直到 3 年前
        1
  •  4
  •   Gordon Davisson    3 年前

    Shell语法的工作方式与您习惯的非常不同。在Shell中,几乎所有东西都是字符串;但是,如果您在需要数字的上下文中使用它,shell会尝试将该字符串解析为数字并使用它(然后,如果有数字结果,它会将结果转换为字符串以用于存储/显示/其他)。

    在的情况下 [ = ] 测试中,字符串只是直接进行比较。在里面 [ -eq ] ,它们被转换为数字并进行比较。例如, [ 05 = 5 ] 为false,因为“05”与“5”不是同一个字符串,但是 [ "05" -eq "5" ] 是真的,因为“05”和“5”都解析为相同的数字。

    引用并不影响这一点。引用所做的是改变被引用部分中的字符的解析方式。双引号变量的重要之处在于,它可以防止变量的值被拆分为多个单词和/或通配符扩展为匹配的文件名列表,这两种情况都可能导致混乱。zsh默认情况下不会这样做,所以它( 通常 )不用双引号是安全的。但是IMO双引号仍然是一个好习惯,因为你不一定总是在zsh中。