首页 > 解决方案 > 我在 bash 中的 case 命令中遇到模式匹配问题

问题描述

我通常在 [[ 命令中使用模式匹配,但我想在 case 命令中使用它。

#!/bin/bash
bash -version|head -1
# Test 1:
[[ apple79 == apple@(14|38|79|11) ]] && echo ok 1
# Test2:
case apple79 in apple@(14|38|79|11)) echo ok 2;; *) ;; esac

test.sh当我在终端使用命令运行上述内容时,.一切正常。

. test.sh
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
ok 1
ok 2

但是当我尝试这样运行它时:

./t.sh
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
ok 1
./t.sh: line 6: syntax error near unexpected token `('
./t.sh: line 6: `    case apple79 in apple@(14|38|79|11)) echo ok 2;; *) ;; esac'

我收到了 case 命令的错误消息。我看过一些 bash 模式匹配文档,例如: https ://www.linuxjournal.com/content/pattern-matching-bash 但我对这个问题一无所知。

标签: linuxbash

解决方案


extglob选项在内部隐式启用[[ ... ]]以进行模式匹配,但您需要显式启用它才能将其与case语句一起使用。

#!/bin/bash

shopt -s extglob

[[ apple79 == apple@(14|38|79|11) ]] && echo ok 1
case apple79 in apple@(14|38|79|11)) echo ok 2;; *) ;; esac

推荐阅读