#1 Le 01/08/2022, à 17:18
- MixT
Protection de variable sous bash
Bonjour,
Je possède une suite de vidéo sur lesquelles j'aimerais appliquer une commande
Le dossier contient 3 vidéos : video1.mp3, video2.mp3 et video3.mp3
Voice le script que je rentre :
for video in *.mp3; do
name_v=$(basename $video .mp3)
parameters="$name_v-parameters.dpf"
autodock4 -p $parameters -l $name_m-output.dlg
done
J'obtiens la réponse:
autodock4 -p *-parameters.dpf -l *-output.dlg
La suite de commande attendu est
autodock4 -p video1-parameters.dpf -l video1-output.dlg
autodock4 -p video2-parameters.dpf -l video2-output.dlg
autodock4 -p video3-parameters.dpf -l video3-output.dlg
J'ai essayé de protéger ma variable mais je ne vois pas où pourrais se trouver l'erreur, ou comment mieux la protéger.
--
Modération : merci de poster dans la bonne section. Deux fils déplacés qui n'avaient rien à faire dans les « Truc, Astuces,…»
Dernière modification par bruno (Le 02/08/2022, à 06:59)
Hors ligne
#2 Le 01/08/2022, à 17:59
- diesel
Re : Protection de variable sous bash
for video in ./*.mp3; do
fonctionnerait certainement mieux (en supposant que tes vidéos sont dans le répertoire courant).
Cela dit, il n'y a pas que ça qui cloche.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 01/08/2022, à 18:01)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#3 Le 01/08/2022, à 18:43
- MixT
Re : Protection de variable sous bash
Merci
J'ai essayé
parameters="$($name_v-parameters.dpf)"
parameters='$name_v-parameters.dpf'
Hors ligne
#4 Le 01/08/2022, à 18:47
- MicP
Re : Protection de variable sous bash
Bonjour
Je vérifie ce que j'ai dans le répertoire courant :
michel@deb114x1t:~/aeff/MixT$ ls
video1.mp3 video2.mp3 video3.mp3
michel@deb114x1t:~/aeff/MixT$
Donc, en utilisant la commande echo
je commence par vérifier ce que ça pourrait donner :
michel@deb114x1t:~/aeff/MixT$ for f in *.mp3; do echo "$f"; done
video1.mp3
video2.mp3
video3.mp3
michel@deb114x1t:~/aeff/MixT$
michel@deb114x1t:~/aeff/MixT$ for f in *.mp3; do base="$(basename "$f" .mp3)"; echo "$f" "$base"; done
video1.mp3 video1
video2.mp3 video2
video3.mp3 video3
michel@deb114x1t:~/aeff/MixT$
michel@deb114x1t:~/aeff/MixT$ for f in *.mp3; do base="$(basename "$f" .mp3)"; echo autodock4 -p "$base-parameters.dpf" "$base-output.dlg"; done
autodock4 -p video1-parameters.dpf video1-output.dlg
autodock4 -p video2-parameters.dpf video2-output.dlg
autodock4 -p video3-parameters.dpf video3-output.dlg
michel@deb114x1t:~/aeff/MixT$
Ok, alors maintenant je peux utiliser la même ligne de commande
mais en supprimant la commande echo
ce qui donnera :
for f in *.mp3; do base="$(basename "$f" .mp3)"; autodock4 -p "$base-parameters.dpf" "$base-output.dlg"; done
Dernière modification par MicP (Le 01/08/2022, à 18:56)
Hors ligne
#5 Le 01/08/2022, à 19:04
- MixT
Re : Protection de variable sous bash
Merci beaucoup !! Je sentais qu'à un moment je protégeais mal ma variable
Dernière modification par MixT (Le 01/08/2022, à 19:05)
Hors ligne
#6 Le 01/08/2022, à 20:59
- Tawal
Re : Protection de variable sous bash
Hello,
(je viens de l'apprendre aujourd'hui)
Les doubles quotes lors d'une affectation de variable par substitution de commande sont superfules.
Quelque soit le retour de la substitution
(test réalisé par shellcheck après avoir été informé de cela par vv222 sur Debian-Facile)
Edit :
Donc
base="$(basename "$video" .mp3)"
et
base=$(basename "$video" .mp3)
sont totalement équivalents et dans le 1er cas les doubles quotes entourant la substitution de commande sont superflues
Dernière modification par Tawal (Le 01/08/2022, à 21:05)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#7 Le 01/08/2022, à 21:16
- MicP
Re : Protection de variable sous bash
Ok, merci pour l'information, (=> bash est vraiment bien foutu )
Par contre, il ne faudra pas oublier de les mettre
autour de la variable utilisée dans la commande pour la suite du script,
sinon, dans le cas où un nom de fichier comporterait un caractère espace (ou autre piège du même genre) :
michel@deb114x1t:~/aeff/MixT$ ls -l
total 0
-rw-r--r-- 1 michel michel 0 1 août 22:07 'video 1.mp3'
-rw-r--r-- 1 michel michel 0 1 août 22:07 'video 2.mp3'
-rw-r--r-- 1 michel michel 0 1 août 22:07 'video 3.mp3'
michel@deb114x1t:~/aeff/MixT$
michel@deb114x1t:~/aeff/MixT$ for f in *.mp3; do base=$(basename $f .mp3); echo "$f" "$base"; done
basename: opérande supplémentaire « .mp3 »
Saisissez « basename --help » pour plus d'informations.
video 1.mp3
basename: opérande supplémentaire « .mp3 »
Saisissez « basename --help » pour plus d'informations.
video 2.mp3
basename: opérande supplémentaire « .mp3 »
Saisissez « basename --help » pour plus d'informations.
video 3.mp3
michel@deb114x1t:~/aeff/MixT$
Dernière modification par MicP (Le 01/08/2022, à 21:17)
Hors ligne
#8 Le 01/08/2022, à 21:18
- Tawal
Re : Protection de variable sous bash
Tout à fait MicP
Mais je ne parlais que du cas d'une affectation par substitution de commande
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne