Bash与>相同的字符串比较或者<

时间:2015-12-31 11:41:05

标签: string bash scripting comparison

为什么打印这行代码?

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

这一行:

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

2 个答案:

答案 0 :(得分:4)

您不是在比较字符串。 <是一个重定向操作符,因此实际上您正在检查此类操作是否成功。它是有效的,因为您正在运行命令的目录中有一个文件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

  

<强> [[...]]

     

与[[,&lt;和&gt;运营商按字典顺序排序   当前的语言环境。

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

答案 1 :(得分:3)

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

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

[又名test命令会将其参数解释为字符串,就像任何其他unix命令一样。请注意,这不会解析为true,因为它们是相同的,因此不能在词法上进行排序。你需要自己包括平等。

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

<>运算符不属于POSIX specification of test,因此它是特定于shell的功能,可能与其他shell实现不兼容或行为不同。