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 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 big_smile, ç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

Totor a écrit :

${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 ... hmm

Comprendre, c'est quand meme  .. mieux que d'appliquer betement smile

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 smile
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 .... hmm

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 tongue

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 big_smile

j'expérimente au fur et à mesure de mes besoins ....et necessités smile

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 smile

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 ?? smile

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 smile

Dernière modification par philoup44 (Le 09/08/2012, à 15:36)

Hors ligne