带有 extglob 的 Case 语句

PSk*_*cik 7 bash

使用extglob,我想匹配一个变量

*( )x*
Run Code Online (Sandbox Code Playgroud)

(在正则表达式:/^ *x.*/

这个:

main(){
  shopt -s extglob
  local line=' x bar'
  case "$line" in
    *( )x*) ;;
    *) ;;
  esac
}
main "$@"
Run Code Online (Sandbox Code Playgroud)

给我一个语法错误。要么除去extglob括号或移动shopt -s extglob之外main,到外范围,解决了这个问题。为什么?为什么shopt -s extglob命令需要在外面?

Gor*_*son 9

bash 必须解析函数才能创建它,并且由于您使用的扩展 glob 语法通常是无效的,因此它无法解析该函数​​,除非在创建函数时extglob 处于打开状态

最终结果:extglob 必须在函数声明运行时都打开。shopt -s extglob函数中的行处理第二个要求,但不是第一个。

顺便说一句,还有其他一些地方可能会出现问题。例如,如果您有一个whileorfor循环,bash 需要在开始运行之前解析整个循环。因此,如果循环中的某些内容使用了 extglob,则必须在循环开始之前启用它。