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