sed ou rename en shell avec des variables

Voilà deux heures que je cherche pourquoi diable lorsque j’utilise rename ou sed dans un script shell, ma seconde variable n’est pas prise en charge.

En fait, la réponse est … vraiment… très … simple. Où bête ?

Le scénario est le suivant. J’ai des fichiers nommez xyz.??? avec différentes extensions, mais le même préfix. Je veux les renommer depuis un script shell.

J’ai deux variables dans mon script: $ancien_nom et $nouveau_nom

trouvez l’erreur.

Avec sed:

for i in $ancien_nom.*;
do
	mv $i `echo $i | sed 's/$ancien_nom/$nouveau_nom/'`
done

ou

for i in $ancien_nom.*;
do
	mv $i `echo $i | sed "s/$ancien_nom/$nouveau_nom/"`
done

avec rename:

rename 's/$vmtempname/$vmname/' $vmtempname.*

ou

rename "s/$vmtempname/$vmname/" $vmtempname.*

Alors. Vous avez trouvé ?

Dans les deux cas, dans le premier exemple, on utilise des apostrophes pour encadrer l’expression perl, alors que dans le deuxième exemple, on utilise des guillements.

Hé bien voilà la raison pour laquelle je sèche depuis deux heures. Rageant, n’est-ce pas ?

En fait, en utilisant les apostrophes, la seconde variable ($nouveau_nom) n’est pas prise en compte. Donc on finit par essayer de renommer $ancien_nom.* par $ancien_nom.*. Alors qu’avec les guillemets, tout se passe bien. Les mystères du Shell. Si quelqu’un en connait la raison profonde, merci de laisser un commentaire explicatif.

En résumé: Dans un script bash, pour encardrer une expression perl, il faut utiliser les guillemets, et non les apostrophes. CQFD

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.