[bash case语句语法使用扩展模式匹配

问题描述 投票:2回答:2

此代码在GNU bash版本5.0.7(1)-发行版(x86_64-redhat-linux-gnu)上运行:

var="r=x"
case "$var" in
        r=?(x|xy|xyz))
                echo "suchess"
                ;;
esac

正在生成此错误:

bash: test.sh: line 3: syntax error near unexpected token `('
bash: test.sh: line 3: `        r=?(x|xy|xyz))'

无法终生了解,为什么...经过测试的代码找到了here并且可以正常工作。

bash switch-statement pattern-matching syntax-error
2个回答
2
投票

啊。所以这很尴尬。我几乎在发布此消息后就找到了答案。答案在我问题的链接中。我需要添加:

shopt -s extglob

到脚本的开头。

希望这对以后的人有所帮助。

在此处找到答案:How to use patterns in a case statement?


2
投票

此外,您也可以不必显式使用/设置extglob选项,并使用case语句进行此匹配。如果使用bash,则与test一起使用时,==运算符会提供此匹配项

var="r=x"
if [[ $var == r=?(x|xy|xyz) ]]; then
    printf '%s\n' "success"
fi

请确保您不要在==运算符的右侧引用全局模式。可以在上面使用它,也可以进行变量赋值来存储glob并进行无引号的比较

glob="r=?(x|xy|xyz)"
if [[ $var == $glob ]]; then
© www.soinside.com 2019 - 2024. All rights reserved.