根据bash 手册:
control operator执行控制功能的令牌。它是换行符或以下之一:“||”、“&&”、“&”、“;”、“;;”、“|”、“|&”、“(”或“)”。
metacharacter不加引号时用于分隔单词的字符。元字符是空格或以下字符之一:“|”、“&”、“;”、“(”、“)”、“<”或“>”。
许多字符都是control operator和metacharacter。
那么我怎么知道例如 a 的语法类别;呢?
以if COND ; then CMD ; fi作为一个例子。
;control operator在上下文中似乎是 a ,因为它可以用newline代替。然而去除前置和后置空间s左右;仍然工作正常。如果它是一个运算符,它不应该被 sapces 分隔吗?
根据bash手册,anoperator是:
一个控制操作员或重定向操作。有关重定向运算符的列表,请参阅重定向。运算符至少包含一个不带引号的元字符。
元字符基本上是任何不能属于 word.
的定义word:
被外壳视为一个单元的字符序列。单词可能不包括未加引号的元字符。
周围不需要空格,operators因为它们总是包含metacharacters,这使解析器知道它不是word.
一个例外是redirection,例如
ls 2>&1
Run Code Online (Sandbox Code Playgroud)
重定向语句前需要一个空格,因为操作符有一个参数2,并且要求参数紧挨着操作符(否则它将是一个参数到ls)。