来自$ help test
:
test:test [expr]
评估条件表达式。
退出状态为0(真)或1(假)取决于 EXPR的评估。表达式可以是一元或二元的。一元 表达式通常用于检查文件的状态。那里 也是字符串运算符和数字比较运算符。
我对expr
可能包含的内容感到有点困惑。 test
的帮助页面表明它是一个条件表达式,由文件,字符串或数字运算符组成。那么字符串比较运算符如何导致不需要的文件重定向?
$ [ "a" > "b" ]
$ ls -la
-rw-rw-r-- 1 user user 0 May 28 17:22 b
我理解为了防止重新指示我需要逃避>
,但我很困惑为什么。我不能像expr
一样发出任何命令:
$ [ echo "hello" ]
bash: [: echo: unary operator expected
据我所知,帮助文本test
仅评估expr
- file re-direction not being one of them中的预定义运算符。 test
/ [
仅用于评估条件表达式 - 我仅限于test
接受的运算符,以及它接受的参数。
(为了进行比较,使用以下内置函数,>
的含义并不存在混淆,并且不需要转义):
$ echo $[2>1]
1
那么将>
解释为需要转义的重定向是什么呢?
答案 0 :(得分:4)
test
是一个普通的命令,而不是特殊的语法,因此经历与任何其他命令相同的处理。
[ "a" > "b" ]
只是
的一个(过于)聪明的同义词test "a" > "b"
因此>
被识别为test
的参数之前的输出重定向。可以编写完全相同的命令
[ "a" ] > "b"
为防止shell将>
识别为重定向运算符,必须对其进行转义。
[ "a" \> "b" ] # or [ "a" ">" "b" ]
您提供的另一个示例,$[2>1]
是特殊语法(不仅仅是内置命令),因此不会进行相同的处理。 $[...]
是一种过时的,不再记录的算术扩展形式,相当于$((2>1))
。作为特殊语法,shell解析$[...]
的内容与普通命令的内容不同。
关于]
的说明。 test
是一个常规命令,因此负责在其认为合适时解释其参数。以下都是语法正确:
test a \> b
test a \> b ]
[ a \> b
[ a \> b ]
但是,只有1和4 语义正确。当用作[
时,最后一个参数必须为]
,才能保持[ ... ]
的错觉仅仅是"分组"表达。
$ [ a \> b
bash: [: missing `]'
当用作test
时,]
根本不是表达式的有效部分,必须省略。
$ test a \> b ]
bash: test: too many arguments