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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bash case语句语法使用扩展模式匹配相关的知识,希望对你有一定的参考价值。

此代码在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并且可以正常工作。

答案

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

shopt -s extglob

到脚本的开头。

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

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

另一答案

此外,您也可以不必显式使用/设置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

以上是关于[bash case语句语法使用扩展模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本—— case语句+函数

bash switch-case 语句给出语法错误

15bash编程case函数

bash脚本----case和function

c#语法糖模式匹配switch 表达式

12.scala的模式匹配