Je m'entraîne avec la substitution de paramètres dans bash.
J'ai écrit le script factice suivant :
#!/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}/}"
Fondamentalement, le modèle est destiné à supprimer la dernière partie du nom du fichier
.
L'exécution du script factice donne :
~$ ./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
alors que eval
ing le contenu du script ou, de manière équivalente, l'entrée directe de cette séquence de commandes dans le shell interactif, se traduit par :
~$ 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
Le motif '.[0-9]*.ext'
fonctionne, donc le problème est clairement confiné à la sous-chaîne '?(.random)'
. Le problème pourrait être avec ?
, puisqu'il s'agit d'un caractère réservé dans le cadre de la substitution de paramètres. Cependant, si tel était le problème, je m'attendrais à ce que le modèle échoue ou réussisse de la même manière dans les deux cas.
Où est le piège probablement évident ?
Réponse acceptée :
Le problème peut être que le extglob
L'option shell est définie dans le shell interactif, mais pas dans le 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
Vous pouvez donc essayer de mettre shopt -s extglob
juste après la ligne shebang dans le script.
Extrait du manuel de référence de Bash :
Si le
extglob
l'option shell est activée à l'aide deshopt
intégré,
plusieurs opérateurs de correspondance de modèles étendus sont reconnus….
Les modèles composites peuvent être formés à l'aide d'un ou plusieurs des sous-modèles suivants :
?(PATTERN-LIST)
Correspond à zéro ou une occurrence des modèles donnés.