GNU/Linux >> Tutoriels Linux >  >> Linux

Substitution de paramètres bash :ligne de commande contre. Scénario?

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 de shopt 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.


Linux
  1. Bash =~ Regex et Https://regex101.com/?

  2. Passer les arguments de la ligne de commande au script Bash ?

  3. Bash Echo La ligne de commande exécutée sur la ligne de commande elle-même (pas dans un script) ?

  4. Saisir automatiquement l'entrée dans la ligne de commande ?

  5. Que fait la ligne '!/bin/sh -e' ?

Comment lire un fichier ligne par ligne dans Bash

Commande de source bash

35 exemples de scripts bash

Script bash (III)

Ajouter une ligne au fichier /etc/hosts avec le script shell

Exécutez la commande bash sur le pipeline jenkins