【问题标题】:Why does the test command need escaping for ">"?为什么测试命令需要为“>”转义?
【发布时间】:2023-03-16 16:08:01
【问题描述】:

来自$ help test

测试:测试 [expr]

计算条件表达式。

退出状态为 0(真)或 1(假),具体取决于 EXPR 的评估。表达式可以是一元或二元的。一元 表达式通常用于检查文件的状态。那里 也是字符串运算符和数值比较运算符。

我对@9​​87654323@ 应该包含的内容有点困惑。 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

那么将> 解释为需要转义的重定向意味着什么?

【问题讨论】:

  • 我的 bash 手册页说:The old format $[expression] is deprecated and will be removed in upcoming versions of bash. 请改用$((...))
  • 那是哪个手册页?它甚至不在 macOS 的 3.2 手册页中,日期为 2008 年。

标签: bash syntax


【解决方案1】:

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 ]

但是,只有 1 和 4 是 语义 正确的。当用作[ 时,最后一个参数必须],以维持[ ... ] 的错觉,只是将表达式“分组”。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2013-01-28
    • 2014-01-22
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多