为什么测试命令需要转义">"?

时间:2018-05-28 16:40:33

标签: bash syntax

来自$ 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

那么将>解释为需要转义的重定向是什么呢?

1 个答案:

答案 0 :(得分:4)

test是一个普通的命令,而不是特殊的语法,因此经历与任何其他命令相同的处理。

[ "a" > "b" ]

只是

的一个(过于)聪明的同义词
test "a" > "b"

因此>被识别为test的参数之前的输出重定向。可以编写完全相同的命令

[ "a" ] > "b"

为防止shell将>识别为重定向运算符,必​​须对其进行转义。

[ "a" \> "b" ]  # or [ "a" ">" "b" ]

您提供的另一个示例,$[2>1] 特殊语法(不仅仅是内置命令),因此不会进行相同的处理。 $[...]是一种过时的,不再记录的算术扩展形式,相当于$((2>1))。作为特殊语法,shell解析$[...]的内容与普通命令的内容不同。

关于]的说明。 test是一个常规命令,因此负责在其认为合适时解释其参数。以下都是语法正确:

  1. test a \> b
  2. test a \> b ]
  3. [ a \> b
  4. [ a \> b ]
  5. 但是,只有1和4 语义正确。当用作[时,最后一个参数必须],才能保持[ ... ]的错觉仅仅是"分组"表达。

    $ [ a \> b
    bash: [: missing `]'
    

    当用作test时,]根本不是表达式的有效部分,必须省略。

    $ test a \> b ]
    bash: test: too many arguments