shellcase模式[…]不允许的字符
case 模式中的括号表达式似乎不允许[() &;]. 但是,我似乎在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#[&; ()]}是另一种情况;Token Recognition Rule 5 和Parameter Expansion 中涵盖。