为什么打印这行代码?
if [ "a" < "a" ]; then echo wow; fi
这一行:
if [ "a" > "a" ]; then echo woow; fi
答案 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实现不兼容或行为不同。