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

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

稳健地构建路径,

提出的解决方案包括:

shopt -s extglob; dir="${dir//+(\/)//}"

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

答案1

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

启用后extglob+(PATTERN)表示 PATTERN 出现一次或多次。该模式\/与斜杠匹配(反斜杠表示这不是分隔模式和替换文本的斜杠),因此+(\/)匹配一个或多个/字符。

答案2

bash(1)手册页:

          +(pattern-list)
                 Matches one or more occurrences of the given patterns

因此,它就像正+则表达式运算符,应用于括号内的模式。

答案3

取决于外壳。我用桀骜,它有很多功能:

在这里,我可以选择不区分大小写的名称:

#!/bin/zsh
setopt extendedglob

for f in (#i)*.(jpeg|jpg|png); do
    {
        mogrify -scale 1280x1280 $f
        exiv2 rm $f
        mv $f $f:l
    } &
done

相关内容