Como e por que essa expressão globbing funciona?

4

Em um dos meus scripts bash, eu precisei obter a última parte de uma string delimitada por dois pontos. Por exemplo, eu precisava pegar o valor numérico 289283 do seguinte valor:

OK: DriveC-ReadBytesPerSec: 289283

Depois de algumas tentativas e erros, cheguei ao seguinte:

READRESULT="OK: DriveC-ReadBytesPerSec: 289283"
echo ${READRESULT#*:*:*}

Quais saidas 289283 .

O problema é que, enquanto o trabalho é concluído, não entendo completamente por que ${READRESULT#*:*:*} produz o resultado correto.

Alguém pode explicar como funciona essa expressão globbing?

    
por Kev 27.06.2011 / 11:49

1 resposta

10

De man bash :

${parameter#word}
${parameter##word}

Remove matching prefix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the # case) or the longest matching pattern (the ## case) deleted.

Seu padrão é *:*:* e bash tentará remover o prefixo correspondente mais curto:

  • OK: para o primeiro *:
  • DriveC-ReadBytesPerSec: para o segundo *:
  • e nada para o último * , porque é a correspondência mais curta.

Compare:

$ # shortest match without surplus *
$ echo ${READRESULT#*:*:}
289283
$ # going for longest match now; the last * will swallow the number
$ echo ${READRESULT##*:*:*}

$ # longest match without the last *
$ echo ${READRESULT##*:*:}
289283
$ # no need to repeat *: because * matches everything before the last : anyway
$ echo ${READRESULT##*:}
289283
    
por 27.06.2011 / 12:00