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/05/2019, à 15: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, à 16: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, à 15: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) wink
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. sad

Dernière modification par Watael (Le 08/05/2019, à 15:58)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 08/05/2019, à 16: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, à 16:22

kamaris

Re : [RESOLU] Affectation du résultat d'une commande à une variable

echo "$toto"

Hors ligne

#5 Le 08/05/2019, à 16: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. wink sad sad sad

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, à 16: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, à 16: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, à 16: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. smile

Hors ligne

#9 Le 08/05/2019, à 16:44

diesel

Re : [RESOLU] Affectation du résultat d'une commande à une variable

Watael a écrit :

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, à 16: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, à 17: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, à 17: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, à 17: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, à 17:30

diesel

Re : [RESOLU] Affectation du résultat d'une commande à une variable

Watael a écrit :

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, à 17: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, à 18: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, à 18:51

diesel

Re : [RESOLU] Affectation du résultat d'une commande à une variable

LeoMajor a écrit :

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