【问题标题】:Bash identical string comparison with > or <用 > 或 < bash 相同的字符串比较
【发布时间】:2016-04-05 09:34:25
【问题描述】:

为什么要打印这行代码?

if [ "a" < "a" ]; then echo wow; fi

还有这一行:

if [ "a" > "a" ]; then echo woow; fi

【问题讨论】:

  • 您的目录中是否有一个文件a?因为这不是检查字符串。
  • 我没有,但现在我有了,我认为“a”>“a”创造了这样的。
  • @Nick 正确。 [ "a" &lt; "a" ]实际上等价于[ "a" ] &lt; "a";由于[ 是一个简单的命令,输入重定向&lt; "a" 可以出现在[ 之前或其参数列表中的任何位置。
  • 是的; simple 命令可以在重定向操作符之前,因此&lt; "a" [ "a" ] 是合法的(但不是&lt; "a" while read line; do ...; done,因为while 是一个复合命令)。您不经常看到它,但在某些情况下它可能更具可读性。
  • (如果你能原谅我的小吐槽,我认为让[ 成为test 的别名是我见过的最糟糕的设计决策之一。)

标签: string bash scripting comparison


【解决方案1】:

你不是在比较字符串。 &lt; 是一个重定向操作符,所以实际上你正在检查这种操作是否成功。它是有效的,因为您在运行命令的目录中碰巧有一个文件a

看看如果文件a不存在会发生什么:

$ [ "a" < "a" ] && echo "yes"
bash: no such file or directory: a

让我们创建它并再次检查:

$ touch a
$ [ "a" < "a" ] && echo "yes"
yes

如果您想这样做,请使用[[。来自3.2.4.2 Conditional Constructs

[[…]]

当与 [[ 一起使用时, 运算符按字典顺序使用 当前语言环境。

$ [[ "a" < "a" ]] && echo "yes" || echo "no"
no

【讨论】:

    【解决方案2】:

    要阻止 bash 将 &lt;&gt; 解释为管道,您可以使用反斜杠将它们转义,或者像使用其他字符串一样用引号将其括起来。

    if [ "a" \< "a" ]; then echo "wow"; fi;
    if [ "a" "<" "a" ]; then echo "wow"; fi;
    

    [ aka test 命令将像任何其他 unix 命令一样将其参数解释为字符串。请注意,这不会解析为 true,因为它们是相等的,因此不能按词法排序。您需要自己包含相等性。

    if [ "a" \< "a" ] || [ "a" = "a" ]; then echo "wow"; fi;
    

    &lt;&gt; 运算符不属于 POSIX specification of test,因此它是特定于 shell 的功能,可能无法与其他 shell 实现一起工作或表现不同。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多