shell 大小写模式 [...] 不允许的字符

shell case pattern [...] disallowed chars

案例模式中的括号表达式似乎不允许 [() &;]。但是,我似乎无法在 POSIX shell spec, or in the bash manual 中找到任何此类限制(或转义解决方法)。

case '&' in
# *[&]*)  echo y ;;  # won't parse
  *[\&]*) echo y ;;  # will parse & work
esac
# similar for ';', ' ', '(', ')'
# not a problem for ${var#[&; ()]}

这是一个无法调用外部实用程序的 sh shell 脚本函数(但我也对 bash 感到好奇)。那么...是否有任何规范在括号表达式模式中描述反斜杠这些字符?

不,我不认为它在任何地方都有明确的记录。

但可以推导出Token Recognition Rule 6 is applied while the pattern list is being parsed. That is, unless quoted, control operators, redirection operators和输入的结尾被识别为运算符,并分隔一个模式。 shell 期望 | (表示后面有另一个模式)或 ) (标记模式列表的结尾)来做到这一点;其他任何事情都会导致解析错误。

由于方括号在标记化过程中对解析器没有特殊意义,因此它们之间是否出现运算符无关紧要。而 ${var#[&; ()]} 则不同; Token Recognition Rule 5 and Parameter Expansion.