目前正在学习bash。我想知道[ "abc" < $bar ]
命令是什么意思。我知道[]
比较或测试它们的值。但是<
算子在abc
字符串和$bar
变量之间是如何工作的,你能描述一下吗?
[ "abc" < $bar ]
看起来像是程序员的错误。我们可以将其重写为[ "abc" ] < $bar
,具有完全相同的含义。
<
是一个重定向操作符,用于从名为$bar
的文件中读取输入。[
命令忽略标准输入,因此忽略任何输入。如果$bar
变量为空,它将写入bash: $bar: ambiguous redirect
消息。
则[ "abc" ]
检查abc
是否为非空字符串。它不是一个空字符串,所以[ "abc" ]
返回零退出状态,意味着成功。
如果代码的作者打算按字典顺序比较字符串,他应该写[[ "abc" < "$bar" ]]
。[
命令不支持<
操作符(参见POSIX标准,实际上POSIX提到它不包括)。在Bash中,[ "abc" '<' "$bar" ]
可以工作,因为[
是test
的内置别名(参见help [
的输出),并且内置的test
命令确实实现了字符串比较操作符<
和>
。但是/usr/bin/[ a '<' b ]
命令的结果是/usr/bin/[: ‘<’: binary operator expected
。[
外部命令不支持<
。
另外,$bar
没有被引用,所以$bar
的结果经历了分词和文件名扩展,这看起来像另一个错误。记得用shellcheck检查你的脚本。
[ "abc" < $bar ]
^-- SC2073 (error): Escape < to prevent it redirecting (or switch to [[ .. ]]).
^--^ SC2086 (info): Double quote to prevent globbing and word splitting.