Mi sto esercitando con la sostituzione dei parametri in bash.
Ho scritto il seguente script fittizio:
#!/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}/}"
Fondamentalmente, il modello ha lo scopo di rimuovere l'ultima parte del nome del file
.
L'esecuzione dello script fittizio risulta in:
~$ ./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
mentre eval
l'inserimento del contenuto dello script o, equivalentemente, l'input diretto di quella sequenza di comandi nella shell interattiva, risulta in:
~$ 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
Il modello '.[0-9]*.ext'
funziona, quindi il problema è chiaramente limitato alla sottostringa '?(.random)'
. Il problema potrebbe riguardare ?
, poiché è un carattere riservato nel contesto della sostituzione di parametri. Tuttavia, se questo fosse il problema, mi aspetterei che il modello fallisca o riesca allo stesso modo in entrambi i casi.
Dov'è probabilmente l'ovvia trappola?
Risposta accettata:
Il problema potrebbe essere che extglob
l'opzione shell è impostata nella shell interattiva, ma non nella shell dello 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
Quindi puoi provare a inserire shopt -s extglob
subito dopo la riga shebang nello script.
Dal manuale di riferimento di Bash:
Se il extglob
l'opzione shell è abilitata usando shopt
builtin,
vengono riconosciuti diversi operatori di corrispondenza dei modelli estesi….
I modelli compositi possono essere formati utilizzando uno o più dei seguenti modelli secondari:
?(PATTERN-LIST)
Corrisponde a zero o a un'occorrenza dei pattern indicati.