Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/08/2016, à 22:53

Slyfox

[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 Slyfox (Le 27/08/2016, à 11:05)

Hors ligne

#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

Slyfox

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 ! cool

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 smile

Dernière modification par Slyfox (Le 22/08/2016, à 14:31)

Hors ligne

#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

Slyfox

Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.

Watael a écrit :

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 Slyfox (Le 22/08/2016, à 15:03)

Hors ligne

#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.

Slyfox #5 a écrit :

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

Slyfox

Re : [Résolu] Bash - Mettre paramètre d'une commande dans une variable.

Merci à tous pour les solutions apportées ! smile

Je passe cette discussion en résolu.

Hors ligne