Substituição do parâmetro Bash: linha de comando vs. script

4

Estou praticando com a substituição de parâmetros no bash.

Eu escrevi o seguinte script falso:

#!/bin/bash

var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"

pattern='.[0-9]?(.random).ext'

echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"

Basicamente, o padrão é usado para remover a última parte do arquivo nome.

A execução do script fictício resulta em:

~$ ./dummy.sh 
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext

considerando que eval do conteúdo do script ou, equivalentemente, a entrada direta dessa sequência de comandos no shell interativo, resulta em:

~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext

O padrão '.[0-9]*.ext' funciona, portanto, o problema está claramente confinado à subcadeia '?(.random)' . O problema poderia estar com ? , já que é um caractere reservado no contexto de substituição de parâmetro. No entanto, se esse fosse o problema, eu esperaria que o padrão falhasse ou obtivesse o mesmo sucesso em ambos os casos.

Onde está a provável armadilha óbvia?

    
por Patrick Trentin 10.01.2017 / 18:42

1 resposta

10

O problema pode ser que a opção extglob shell esteja definida no shell interativo, mas não no shell de script.

$ shopt -u extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
$ shopt -s extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext

Você pode tentar colocar shopt -s extglob logo após a linha shebang no script.

Do Manual de referência do bash :

If the extglob shell option is enabled using the shopt builtin, several extended pattern matching operators are recognized.... Composite patterns may be formed using one or more of the following sub-patterns:

?(PATTERN-LIST)
    Matches zero or one occurrence of the given patterns.

    
por 10.01.2017 / 19:22