#1 Le 21/08/2016, à 22:53
- Compte supprimé
[Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Bonjour,
Je fais un script complexe et je me heurte à un problème que je simplifie dans cette discussion (c'est juste un principe).
Voici le script qui fonctionne:
#! /bin/bash
ls -l "mon dossier"
Rien de compliquer ! mais maintenant j'aimerais bien mettre une partie de la commande dans un variable du style:
#! /bin/bash
var="-l mon dossier"
ls "${var}"
J'ai essayer passablement de chose enlever le {}, supprimer les " ", mettre de ' ' ou de ` ` mais rien ne va et le fait que le dossier à nom avec espace cela complique la chose mais je dois faire avec, bien que je crois qu'il faut utilisé IFS=$'\n'
Je pense que c'est basique mais comment faire ?
Merci de partager votre savoir.
Dernière modification par Compte supprimé (Le 27/08/2016, à 11:05)
#2 Le 22/08/2016, à 05:40
- Watael
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
ça sent le gaz cette histoire.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 22/08/2016, à 06:47
- pingouinux
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Bonjour,
Tu as une possibilté, en utilisant la commande potentiellement dangereuse eval (voir la signature de Watael).
var='-l "mon dossier"'
eval ls "${var}"
Hors ligne
#4 Le 22/08/2016, à 07:24
- Hizoka
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Ha ha ha, Watael s'attendait à cette réponse je crois XD
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 22/08/2016, à 14:28
- Compte supprimé
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Merci à tous pour ces réponses claires et précises ! Je m'endormirai moins bête ce soir !
Par contre je profite de cette discussion et de votre savoir pour que vous m'apporter quelque précisions.
1. Pourquoi eval est-il dangereux ou pas bien ?
2. Désolé pour le hors sujet... Dans un test if je vois que des fois qu'on utilise les simples crochets [ ] et parfois les doubles [[ ]] quelle est la différence et le plus recommandé ?
3. On voit plusieurs manière d'écrire une variable comme $var ou ${var} ou "$var" ou "${var}" ... d'habitude j'utilise "{var}" surtout si j'ai une variable avec un ou des espaces, mais quelle est la manière d'utilisation la plus recommandé ?
Merci
Dernière modification par Compte supprimé (Le 22/08/2016, à 14:31)
#6 Le 22/08/2016, à 14:33
- Watael
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
j'ai quelques règles, que, peut-être un peu bêtement, je ne remets pas en question.
entre autre, ne pas stocker une commande et ses options (pire, avec ses arguments) dans une variable, parce que je sais les complications que cela induira.
alors, stocker une commande dans une variable, et ses options dans d'autres... ouille, ouille, ouille!
mais, Slyfox, quel est l'intérêt de procéder ainsi ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 22/08/2016, à 14:50
- Compte supprimé
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Slyfox, quel est l'intérêt de procéder ainsi ?
En fait je fait un script pour convertir les vidéos avec yad comme interface graphique et ffmpeg pour la partie conversion.
Le script fonctionne ainsi, une fenêtre s'ouvre et l'utilisateur choisit les options comme le conteneur, le codec vidéo et audio, le crf, le preset...
Voici un extrait très simplifié des variables une fois les choix effectués (ils sont multiples):
#!/bin/bash
video="-c:v libx264"
crf="-crf 28"
audio="-c:a copy"
supTag="-map_metadata -1"
newTag="-metadata title="
newVideo="ma nouvelle vidéo"
ffmpeg -y -i "video.avi" ${video} ${crf} ${audio} ${supTag} ${newTag}"${newVideo}" "video.mkv"
Pour éviter de récrire complètement chaque ligne de commande de ffmpeg pour chaque choix (une bonne trentaine) j'ai préféré opté par la modification des variables elles même via un gros test if...
EDIT
Ma question initiale venait du fait que j'avais un problème avec la variable newTag car je l'écrivais faussement ainsi:
newTag="-metadata title=${newVideo}"
Dernière modification par Compte supprimé (Le 22/08/2016, à 15:03)
#8 Le 22/08/2016, à 18:07
- Hizoka
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
J'ai fait un soft du meme genre et tu fais ca tout simplement :
cmd="ffmpeg -i XXX "
[[ -n ${video} ]] && cmd+="${video} "
[[ -n ${crf} ]] && cmd+="${crf} "
....
echo "${cmd}"
Perso j'utilise toujours "${}" et [[]] pour eviter tout probleme d'espace...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#9 Le 22/08/2016, à 18:51
- pingouinux
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
3. On voit plusieurs manière d'écrire une variable comme $var ou ${var} ou "$var" ou "${var}" ... d'habitude j'utilise "{var}" surtout si j'ai une variable avec un ou des espaces, mais quelle est la manière d'utilisation la plus recommandé ?
Pour compléter ce que dit Hizoka en #8
:
$var est équivalent à ${var}
"$var" est équivalent à "${var}" (utile s'il y a des espaces, tabulations, etc…)
Voici un exemple où es accolades sont nécessaires :
$ var=ma_variable
$ echo $var_1000
$ echo ${var}_1000
ma_variable_1000
Hors ligne
#10 Le 22/08/2016, à 19:26
- Hizoka
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
le super site FR sur bash : http://abs.traduc.org/abs-fr/
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 25/08/2016, à 13:10
- credenhill
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
hello
avec un nom sans espaces
#! /bin/bash
set -- -l mon-dossier
ls $@
ou
#! /bin/bash
var=(-l mon-dossier)
ls ${var[@]}
Hors ligne
#12 Le 25/08/2016, à 15:35
- pingouinux
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Si les noms contiennent des espaces, les méthodes de credenhill en #11 s'adaptent facilement :
#! /bin/bash
set -- -l "mon dossier avec espaces"
ls "$@"
#! /bin/bash
var=(-l "mon dossier avec espaces")
ls "${var[@]}"
Hors ligne
#13 Le 27/08/2016, à 11:04
- Compte supprimé
Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.
Merci à tous pour les solutions apportées !
Je passe cette discussion en résolu.