这个带有 extglob 的 shell 命令的语法是什么意思?

Joe*_*Joe 6 shell scripting

稳健地构建路径中

提出的解决方案包括:

shopt -s extglob; dir="${dir//+(\/)//}"
Run Code Online (Sandbox Code Playgroud)

有人可以为我解释(解析)吗?我明白它在做什么,但不明白语法是如何工作的。

cjm*_*cjm 8

dir="${dir//+(\/)//}"正在使用${PARAMETER/PATTERN/STRING}扩展。在这种情况下分解它(使用让人想起 Perl 的/x正则表达式修饰符的语法,而不是有效的 Bash 语法):

${       # start expansion
  dir    # the parameter being expanded
  /      # separates parameter from pattern
  /      # double slash means replace all instead of replace first
  +(\/)  # the pattern we're looking for
  /      # separates pattern from replacement
  /      # the replacement text
}        # end expansion
Run Code Online (Sandbox Code Playgroud)

extglob启用,+(PATTERN)意味着模式的一个或多个出现。模式\/匹配一个斜杠(反斜杠表示这不是分隔模式和替换文本的斜杠),所以+(\/)匹配一个或多个/字符。