#1 Le 08/08/2012, à 14:57
- philoup44
[RESOLU] Variables ,accolades et point d'exclamation
Salut
Je voulais voir si on pouvait entrer le nom d'une variable (et pas son contenu) dans un tableau
puis plus tard extraire cette variable du tableau
et en afficher la valeur
ex:
#!/bin/bash
toto='16 36 47'
Tableau=( 0 0 0 0 0 0 0 0 0 0 0 1 tata 0 0 0 0 titi 1 0 0 1 toc 0 0 0 0 tac toto 0 0 )
choix=`echo ${Tableau[*]} | tr " " "\n" | grep toto`
new=`echo ${Tableau[28]}`
echo $new # ------> affiche toto
aa="${!new}"
echo $aa # affiche 16 36 47 !!
exit 0;
J'y suis arrivé grace à cette ligne d'écriture ---> variable1="${!variable2}"
ici ---> aa="${!new}"
Mais il m'a fallu plus de 5 heures de tatonnement pour y arriver à savoir
utiliser ---> variable1="${!variable2}"
pour afficher le contenu de la variable et non pas le nom de la variable
car toutes les autres écriture ne m'affichaient que le nom ---> toto
la seule qui à faillie fonctionner également a été
aa=$(( $new ))
mais j'avais droit à un message d'erreur car bash ne voyait que 16
et avait du mal à interpreter les valeurs 36 et 47
Je suis , ça fonctionne
Mais je ne sais pas réellement pourquoi
Et j'aimerais bien comprendre cette syntaxe
variable1="${!variable2}"
J'ai trouvé ça ici sur le Forum
${paramètre}
est remplacé par la valeur du paramètre.
Les accolades { } sont nécessaire quand
le paramètre est un paramètre positionnel ayant plusieurs chiffres,
ou si le paramètre est suivi de caractères n’appartenant pas à son nom.
--------------------------------------------------------------------------------------------
Si le premier caractère du paramètre est un point d’exclamation ! ,
un niveau d’indirection de variable est introduit.
Bash utilise la valeur de la variable formée par le reste du paramètre comme un nom de variable.
Cette variable est alors développée et la valeur utilisée pour le reste de la substitution plutôt que la valeur du
paramètre lui-même.
On appelle ce mécanisme le développement indirect.
Les exceptions à celui-ci sont les développements de ${!prefix*} et de ${!nom[@]} décrits plus bas.
Le point d’exclamation doit immédiatement suivre l’accolade ouvrante afin d’introduire l’indirection.
Dans chacun des cas ci-dessous,
le mot est soumis au développement du tilde,
au développement des paramètres,
à la substitution de commande
et au développement arithmétique.Quand il n’effectue pas de développement de sous-chaîne,
bash teste si le paramètre est inexistant ou vide ;
l’absence des deux-points induit un test sur la seule inexistence du paramètre.
Mais pas facile à traduire ...
Comprendre, c'est quand meme .. mieux que d'appliquer betement
Merci pour toute réponse
Dernière modification par philoup44 (Le 08/09/2012, à 22:27)
Hors ligne
#2 Le 08/08/2012, à 15:10
- iuchiban
Re : [RESOLU] Variables ,accolades et point d'exclamation
salut,
un très bon site pour scripter en shell : http://abs.traduc.org/abs-fr/index.html
pour les tableaux : http://abs.traduc.org/abs-fr/ch27.html
oups correction
le temps de comprendre ta demande.
donc ben ta façon de faire est la bonne et ça s'appelle une indirection ou référence indirecte : http://abs.traduc.org/abs-fr/ch28.html
C'est intégré au shell.
http://abs.traduc.org/abs-fr/ch37.html#ex78
Dernière modification par iuchiban (Le 08/08/2012, à 15:14)
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#3 Le 08/08/2012, à 15:57
- philoup44
Re : [RESOLU] Variables ,accolades et point d'exclamation
Merci iuchiban
Pour ton lien
et encore un nouveau copier-coller sur le shell ....
y a pas de fin ....
Je connaissais ce site, mais il y a tant de choses à apprendre au début
que je n'ai pour l'instant pas tout vu
ni ... retenu... tout ce que j'ai déja lu
Ce qui manque le plus quand on début, ce sont les exemples simples, trrres simples ....
de la vulgarisation quoi ....
Heureusement, il y a des forums comme celui-ci avec de bonnes ames pour éclaircir un peu le sujet
j'expérimente au fur et à mesure de mes besoins ....et necessités
Dernière modification par philoup44 (Le 08/08/2012, à 16:09)
Hors ligne
#4 Le 08/08/2012, à 16:15
- iuchiban
Re : [RESOLU] Variables ,accolades et point d'exclamation
ben en gros là ca revient à expliquer pourquoi quand tu fais "echo toto" ca affiche toto et quand tu fais "echo $toto" ca affiche le contenu de la variable toto.
abc=test
toto=abc
echo toto => affiche toto
echo $toto => affiche le contenu de la variable toto, donc abc
echo ${!toto} => affiche le contenu de la variable dont le nom est le contenu de toto (donc abc), donc test
j'espère que tu comprends mieux comme ça
et pour ce qui est des exemples simples et biens expliqués, ABS est vraiment bien.
Dernière modification par iuchiban (Le 08/08/2012, à 16:15)
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#5 Le 08/08/2012, à 18:05
- philoup44
Re : [RESOLU] Variables ,accolades et point d'exclamation
Merci iuchiban
Maintenant que je connais le terme références indirectes
Je sais comment creuser la question
Résumé
a=b
b=c
alors a=b si ---> echo $a
a=c si----> echo ${!a}
-------------------------------------------
mer=eau
eau=poisson
echo $mer ---> afiche eau
echo ${!mer} ---> affiche poisson
----------------------------------------------
question peut etre ....tres bete
si je rajoute
poisson=aretes
echo ${!mer} ---> affichera aretes ou poisson ??
ou seul echo ${!eau} ----> affichera aretes ??
car j'ai lu qu'il était question de variables de 1er ordre et second ordre
mais rien au dela ....
la notation ${!variable} introduite dans la version 2 de Bash rend les références indirectes plus intuitives
Hors ligne
#6 Le 09/08/2012, à 08:52
- iuchiban
Re : [RESOLU] Variables ,accolades et point d'exclamation
Ben si tu fais le tests, ça te donne quoi ??
Moi :
$ cat Test.sh
#!/bin/bash
mer=eau
eau=poisson
echo "\$mer : $mer"
echo "\${!mer} : ${!mer}"
poisson=aretes
echo "\${!mer} : ${!mer}"
echo "\${!eau} : ${!eau}"
$ ./Test.sh
$mer : eau
${!mer} : poisson
${!mer} : poisson
${!eau} : aretes
C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.
Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.
Hors ligne
#7 Le 09/08/2012, à 15:21
- philoup44
Re : [RESOLU] Variables ,accolades et point d'exclamation
Salut iuchiban
Désolé hier la question m'est venue à l'esprit en te répondant
j'avais effectivement l'intention de l'expérimenter moi-meme
Mais petit souci d'imprimante ....
pas eu le temps
J'obtiens la meme chose que toi
$ cat essai_ref_indirecte_1.sh
#!/bin/bash
mer=eau
eau=poisson
echo "\$mer : $mer" # affiche eau
echo "\${!mer} : ${!mer}" # affiche poisson
poisson=aretes
echo "poisson=aretes"
echo "\${!mer} : ${!mer}" # affiche poisson
echo "\${!eau} : ${!eau}" # affiche aretes
# mer=eau=poisson
# eau=poisson=aretes
echo
echo "\${!mer:+aretes} : ${!mer:+aretes}" # affiche aretes
echo "\${!mer:+\${!eau}} : ${!mer:+${!eau}}" # affiche aretes
exit 0;
$ ./essai_ref_indirecte_1.sh
$mer : eau
${!mer} : poisson
poisson=aretes
${!mer} : poisson
${!eau} : aretes
${!mer:+aretes} : aretes
${!mer:+${!eau}} : aretes
Conclusion
ça doit se limiter au second ordre ...
Substitution de Variables
Expression ${variable:+valeur}
- Si la variable n'est pas vide, l'expression est substituée par valeur
- Si la variable est vide, l'expression est substituée par $variable, donc vide
ici cela ne représente pas grand interet (je crois)
Mais marier tout ça avec des tableaux ... à voir
Dans ma premiere question remplacer
toto ---> eau
'16 36 47' ---> poisson
new ---------> mer
eau=poisson
Tableau=( 0 0 0 eau 0 0 )
mer=`echo ${Tableau[3]}` # mer=eau
echo $mer # affiche ---> eau
echo ${!mer} # affiche ---> poisson !!
exit 0;
NB
pour ABS j'ai trouvé ce site
on ne peut pas encore télécharger la dernière version ( mise à jour )
Encore merci
Dernière modification par philoup44 (Le 09/08/2012, à 15:36)
Hors ligne