#1 Le 08/05/2019, à 14:35
- diesel
[RESOLU] Affectation du résultat d'une commande à une variable
Si j'écris le script suivant
#!/bin/bash
host 2.fr.pool.ntp.org | grep "IPv6 address" > ./temp
while read i
do echo $i
done <./temp
rm ./temp
J'obtiens le résultat suivant
jean-marie@jean-marie:~$ ./tutu.sh
2.fr.pool.ntp.org has IPv6 address 2001:41d0:1:8da1::123
2.fr.pool.ntp.org has IPv6 address 2001:41d0:8:de07::1
2.fr.pool.ntp.org has IPv6 address 2001:41d0:a:588b::1
2.fr.pool.ntp.org has IPv6 address 2a01:e35:2fba:7c00::21
jean-marie@jean-marie:~$
ce qui est bien.
Par contre, si je fais
#!/bin/bash
for i in $(host 2.fr.pool.ntp.org | grep "IPv6 address")
do echo $i
done
J'obtiens
jean-marie@jean-marie:~$ ./tutu.sh
2.fr.pool.ntp.org
has
IPv6
address
2001:41d0:1:8da1::123
2.fr.pool.ntp.org
has
IPv6
address
2001:41d0:8:de07::1
2.fr.pool.ntp.org
has
IPv6
address
2001:41d0:a:588b::1
2.fr.pool.ntp.org
has
IPv6
address
2a01:e35:2fba:7c00::21
jean-marie@jean-marie:~$
Ce qui n'est évidemment pas ce que je veux.
Où est-ce que j'ai merdé ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 08/05/2019, à 15:25)
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
#2 Le 08/05/2019, à 14:57
- Watael
Re : [RESOLU] Affectation du résultat d'une commande à une variable
tu utilises une boucle for pour parser une Substitution de commandes, et ça, c'est mal (aussi)
parce quefor lit des mots, et non des lignes.
utilise une Substitution de processus :
while read line; do echo "$line"; done < <(commande)
ou un pipe :
commande | while ...
il y a un inconvénient, "palliable" toutefois, à cette dernière méthode : les variables qui sont créées n'existent pas hors du pipe.
Dernière modification par Watael (Le 08/05/2019, à 14:58)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 08/05/2019, à 15:19
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
Merci beaucoup Watael,
J'ai une question corollaire :
Si je fais
host 2.fr.pool.ntp.org | grep 'IPv6 address'
J'obtiens
jean-marie@jean-marie:~$ host 2.fr.pool.ntp.org | grep 'IPv6 address'
2.fr.pool.ntp.org has IPv6 address 2001:41d0:401:3100::1240
2.fr.pool.ntp.org has IPv6 address 2001:41d0:a:254::1
2.fr.pool.ntp.org has IPv6 address 2001:41d0:2:9b0f::baba:1
2.fr.pool.ntp.org has IPv6 address 2001:41d0:305:2100::dd3
jean-marie@jean-marie:~
Jusque là, rien à dire.
Par contre, si je fais
toto=$(host 2.fr.pool.ntp.org | grep 'IPv6 address');echo $toto
J'obtiens
jean-marie@jean-marie:~$ toto=$(host 2.fr.pool.ntp.org | grep 'IPv6 address');echo $toto
2.fr.pool.ntp.org has IPv6 address 2001:41d0:401:3100::1240 2.fr.pool.ntp.org has IPv6 address 2001:41d0:a:254::1 2.fr.pool.ntp.org has IPv6 address 2001:41d0:2:9b0f::baba:1 2.fr.pool.ntp.org has IPv6 address 2001:41d0:305:2100::dd3
jean-marie@jean-marie:~$
Et là, il n'y a pas de boucle for ???
Amicalement.
Jean-Marie
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
#4 Le 08/05/2019, à 15:22
- kamaris
Re : [RESOLU] Affectation du résultat d'une commande à une variable
echo "$toto"
Hors ligne
#5 Le 08/05/2019, à 15:24
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
Bien vu Kamaris,
Je crois que je resterai une brèle en bash jusqu'à ma mort.
Amicalement.
Jean-Marie
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
#6 Le 08/05/2019, à 15:31
- kamaris
Re : [RESOLU] Affectation du résultat d'une commande à une variable
C'est aussi comme ça que tu peux régler ta question de départ :
#!/bin/bash
for i in "$(host 2.fr.pool.ntp.org | grep "IPv6 address")"
do echo "$i"
done
Ainsi la boucle for parcourt des lignes et non des mots, et echo affiche la ligne entière à chaque itération.
Hors ligne
#7 Le 08/05/2019, à 15:37
- Watael
Re : [RESOLU] Affectation du résultat d'une commande à une variable
non, non.
là, for ne voit qu'un seul mot.
$ for i in "$(host 2.fr.pool.ntp.org | grep "IPv6 address")"; do echo ">$i<"; done
>2.fr.pool.ntp.org has IPv6 address 2a01:e35:2fba:7c00::21
2.fr.pool.ntp.org has IPv6 address 2001:bc8:271b:100::1
2.fr.pool.ntp.org has IPv6 address 2001:41d0:2:52a7::1:4
2.fr.pool.ntp.org has IPv6 address 2a03:7220:8081:2900::1<
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 08/05/2019, à 15:41
- kamaris
Re : [RESOLU] Affectation du résultat d'une commande à une variable
C'est vrai, autant pour moi. La boucle for est alors d'une utilité à peu près nulle.
Hors ligne
#9 Le 08/05/2019, à 15:44
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
non, non.
là, for ne voit qu'un seul mot.$ for i in "$(host 2.fr.pool.ntp.org | grep "IPv6 address")"; do echo ">$i<"; done >2.fr.pool.ntp.org has IPv6 address 2a01:e35:2fba:7c00::21 2.fr.pool.ntp.org has IPv6 address 2001:bc8:271b:100::1 2.fr.pool.ntp.org has IPv6 address 2001:41d0:2:52a7::1:4 2.fr.pool.ntp.org has IPv6 address 2a03:7220:8081:2900::1<
Là, pour le coup, j'avais déjà essayé ça et je m'étais rendu compte que ça ne marchait pas.
En fait, c'est surtout l'usage de la commande read qui permet de gérer ligne par ligne.
Amicalement.
Jean-Marie
P.S. Ça y est, j'ai réécrit avec la boucle while et <() après le done, ce qui m'a permis de virer le fichier temporaire inutile.
Dernière modification par diesel (Le 08/05/2019, à 15:49)
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
#10 Le 08/05/2019, à 16:18
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
J'ai trouvé une autre syntaxe que je préfère, car plus lisible (pas besoin de retrouver le "done" à la fin de la boucle, qui peut être très loin dans le script, pour savoir ce qui sert à la boucle while).
#!/bin/bash
host 2.fr.pool.ntp.org | grep "IPv6 address" | while read line
do
echo $line
echo
done
Et avec un fichier, ça s'écrit naturellement
#!/bin/bash
cat fichier | while read line
do
echo $line
echo
done
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 08/05/2019, à 16:22)
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
#11 Le 08/05/2019, à 16:28
- Watael
Re : [RESOLU] Affectation du résultat d'une commande à une variable
UUOC!
while read ...done <fichier
mais l'emploi de fichier temporaire est déconseillé, car ça ralentit encore les script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 08/05/2019, à 16:30
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
UUOC!
while read ...done <fichier
mais l'emploi de fichier temporaire est déconseillé, car ça ralentit encore les script.
Dans l'exemple donné au dessus, le "fichier" n'est pas considéré comme étant un fichier temporaire (dans mon script, j'ai aussi à traiter des données qui sont contenues dans un fichier).
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 08/05/2019, à 16:30)
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
#13 Le 08/05/2019, à 17:07
- LeoMajor
Re : [RESOLU] Affectation du résultat d'une commande à une variable
bonjour,
:~$ unset re; declare -A re ; unset c d
:~$ while read ref val; do if [[ "$val" =~ : ]]; then ((c++)); type="IP6"; re["$ref,name"]=$ref; re["$ref,$type,$c"]=$val; else ((d++)); type="IP4"; re["$ref,name"]=$ref; re["$ref,$type,$d"]=$val; fi; done < <(host 2.fr.pool.ntp.org | awk '{print $1,$NF}' )
:~$ for r in "${!re[@]}"; do if [[ "$r" =~ IP6 ]]; then echo "$r,${re[$r]}"; fi ; done | sort -V
2.fr.pool.ntp.org,IP6,1,2001:41d0:a:5a7::1
2.fr.pool.ntp.org,IP6,2,2001:41d0:2:b7a2:0:162:b:123
2.fr.pool.ntp.org,IP6,3,2001:41d0:303:4284::1
2.fr.pool.ntp.org,IP6,4,2001:bc8:2991:101::a3ac:2472
:~$ for r in "${!re[@]}"; do if [[ "$r" =~ IP4 ]]; then echo "$r,${re[$r]}"; fi ; done | sort -V
2.fr.pool.ntp.org,IP4,1,95.81.173.74
2.fr.pool.ntp.org,IP4,2,91.121.96.146
2.fr.pool.ntp.org,IP4,3,178.32.220.7
2.fr.pool.ntp.org,IP4,4,91.224.149.41
Hors ligne
#14 Le 08/05/2019, à 17:51
- diesel
Re : [RESOLU] Affectation du résultat d'une commande à une variable
bonjour,
:~$ unset re; declare -A re ; unset c d :~$ while read ref val; do if [[ "$val" =~ : ]]; then ((c++)); type="IP6"; re["$ref,name"]=$ref; re["$ref,$type,$c"]=$val; else ((d++)); type="IP4"; re["$ref,name"]=$ref; re["$ref,$type,$d"]=$val; fi; done < <(host 2.fr.pool.ntp.org | awk '{print $1,$NF}' ) :~$ for r in "${!re[@]}"; do if [[ "$r" =~ IP6 ]]; then echo "$r,${re[$r]}"; fi ; done | sort -V 2.fr.pool.ntp.org,IP6,1,2001:41d0:a:5a7::1 2.fr.pool.ntp.org,IP6,2,2001:41d0:2:b7a2:0:162:b:123 2.fr.pool.ntp.org,IP6,3,2001:41d0:303:4284::1 2.fr.pool.ntp.org,IP6,4,2001:bc8:2991:101::a3ac:2472 :~$ for r in "${!re[@]}"; do if [[ "$r" =~ IP4 ]]; then echo "$r,${re[$r]}"; fi ; done | sort -V 2.fr.pool.ntp.org,IP4,1,95.81.173.74 2.fr.pool.ntp.org,IP4,2,91.121.96.146 2.fr.pool.ntp.org,IP4,3,178.32.220.7 2.fr.pool.ntp.org,IP4,4,91.224.149.41
???????????????????????????????????????
Pourquoi faire simple quand on peut faire compliqué ?
Amicalement.
Jean-Marie
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