Empêcher bash d'interpréter une variable

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je réalise un script bash qui manipule des chaînes de caractères. Ces chaînes de caractères contiennent des commandes systèmes (par exemple: ls, cd, …).

Ma question est simple: comment faire pour manipuler ces variables (je souhaiterais notamment vérifier si elles correspondent à une regex), sans que bash ne remplace le contenu de la variable par le résultat de la commande (c’est-à-dire que bash va se retrouver à vérifier si la liste de mes fichiers vérifie ma regex, ce n’est pas le comportement que je souhaite…) ?

Merci d’avance.

+0 -0

Je ne suis pas sûr de bien comprendre la question mais bash n’interprète que les strings entre back-quotes (`) donc il suffirait de les mettre entre double-quotes (") ou simple-quotes (’).

« La Nature est un livre écrit en langage mathématique », Galilée

+1 -0
Auteur du sujet

Voici par exemple quelque chose qui ne fonctionne pas:

1
2
3
4
5
echo $line
if [[ $line =~ '^cd$' ]]
then
    echo "ok"
fi

Ce script (tout du moins cet extrait) produit:

1
cd

Preuve que $line contient bien "cd", mais que cette variable ne valide pas l’expression régulière…

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Lorsque tu mets $test (ou l’écriture préférée ${test}) (au passage, c’est pas une super idée de nommer une variable test comme c’est aussi un programme de coreutils) sur une ligne à part, tu demandes explicitement au shell de résoudre le nom et d’exécuter la ligne correspondante. Ça ne t’empêche pas de manipuler le contenu de la variable dans une condition :

1
2
3
4
5
testls="ls"
if [[ ${testls} == "ls" ]]
then
    echo 'OK'
fi

Et si tu voulais manipuler le résultat de la commande ls, ce serait

1
`${testls}`

qu’il faudrait écrire.

Enfin, pour les regex, il ne faut pas les entourer de guillemets, sinon tu essayes de matcher avec une chaîne contenant littéralement les caractères ^cd$, et pas une regex.

Par exemple :

1
2
3
4
5
testls="ls"
if [[ ${testls} =~ ^ls$ ]]
then
    echo 'OK'
fi

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte