大小写模式中的括号表达式似乎不允许使用[() &;]
。然而,在POSIX shell规范或bash手册中,我似乎找不到任何此类限制(或转义解决方案)。
case '&' in
# *[&]*) echo y ;; # won't parse
*[&]*) echo y ;; # will parse & work
esac
# similar for ';', ' ', '(', ')'
# not a problem for ${var#[&; ()]}
这是一个sh
shell脚本函数,不能调用外部实用程序(但我对bash
也很好奇)。所以…是否有任何规范描述在括号表达式模式中反斜杠这些字符?
不,我不认为它在任何地方都有明确的文档。
但是可以推断,在解析模式列表时应用了令牌识别规则6。也就是说,除非加上引号,否则控制操作符、重定向操作符和输入结束符都被识别为操作符,并分隔模式。shell期望|
(表示后面有另一个模式)或)
(标记模式列表的结束)来完成此操作;
由于方括号在标记化过程中对解析器没有特殊意义,因此它们之间是否出现操作符是无关紧要的。${var#[&; ()]}
是另一种情况;包含在令牌识别规则5和参数扩展中。