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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.