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.
案例模式中的括号表达式似乎不允许 [() &;]
。但是,我似乎无法在 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.