O que significa a sintaxe neste comando shell com extglob?

5

Construindo caminhos robustamente ,

Propõe-se uma solução que inclui:

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

Alguém pode explicar (analisar) isso para mim? Eu entendo o que está fazendo, mas não como a sintaxe funciona.

    
por Joe 30.10.2011 / 03:16

3 respostas

6

dir="${dir//+(\/)//}" está usando a ${PARAMETER/PATTERN/STRING} expansão . Quebrando-a nesse caso (usando uma sintaxe que lembra o modificador /x regex do Perl, não sintaxe Bash válida):

${       # 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

Com extglob ativado, +(PATTERN) significa um ou mais ocorrências de PADRÃO. O padrão \/ corresponde a uma barra (a barra invertida serve para indicar que essa não é a barra que separa o padrão e o texto de substituição), portanto, +(\/) corresponde a um ou mais caracteres / .

    
por 30.10.2011 / 05:34
1

Na página bash(1) man:

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

Então, é como o operador + regex, aplicado ao padrão dentro dos parênteses.

    
por 30.10.2011 / 03:43
-1

Depende do shell. Eu uso o zsh , que tem muitos recursos:

Aqui, posso selecionar nomes insensíveis a maiúsculas e minúsculas:

#!/bin/zsh
setopt extendedglob

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