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 01/07/2017, à 17:09

jldamnet

[Résolu] read() et le here-string

question de débutant très certainement, mais je bloque là dessus depuis ce matin malgré le parcours de moultes pages décrivant read et le here-string (<<<) ... comme je n'ai pas pratiqué le shell depuis plus de 10 ans je dois certainement passer à côté d'une énormité !

=====
je veux affecter à 3 variables les adresses des 3 serveurs DNS OpenNIC les plus proches, que me fournit geoip sur le site OpenNIC

la page retournée contient une liste comme ceci

87.98.175.85 # ns10.fr # 97.98%
93.170.96.235 # ns2.uk # 99.51%
5.135.183.146 # ns12.fr # 97.87%
172.104.136.243 # ns2.he.de # 99.39%
130.255.73.90 # ns3.nw.de # 97.25%
151.80.147.153 # ns2.nor.fr # 97.76%
62.113.203.55 # ns1.de # 98.84%
62.113.203.99 # ns30.de # 98.79%

il faut simplement récupérer les adresses IP en tête de ligne, donc à priori head pour isoler 3 lignes puis awk pour en extraire les premières "colonnes"

essai rapide

echo $(curl -s https://api.opennicproject.org/geoip/ | head -3 | awk '{print $1}') 

qui affiche

87.98.175.85 93.170.96.235 5.135.183.146

ou bien

echo "$(curl -s https://api.opennicproject.org/geoip/ | head -3 | awk '{print $1}')" 

qui affiche

87.98.175.85
93.170.96.235
5.135.183.146

jusque là tout va bien

par contre, impossible d'affecter ces valeurs à trois variables

 read ns1 ns2 ns3 <<< $(curl -s https://api.opennicproject.org/geoip/ | head -3 | awk '{print $1}') 

car seule la première variable est chargée

echo $ns1
87.98.175.85
echo $ns2

echo $ns3

une bonne âme aurait-elle une idée ?

Dernière modification par jldamnet (Le 01/07/2017, à 17:25)


retraité au soleil
ex-Digital Equipment, ex-Wang, ex-Youpy, ex-IPC, ex-Gefco

Hors ligne

#2 Le 01/07/2017, à 17:16

pingouinux

Re : [Résolu] read() et le here-string

Bonjour,
Essaye

read ns1 ns2 ns3 <<< $(curl -s https://api.opennicproject.org/geoip/ | head -3 | awk '{printf("%s ",$1)}')

Hors ligne

#3 Le 01/07/2017, à 17:24

jldamnet

Re : [Résolu] read() et le here-string

et ca fonctionne impec !

merci 1000 fois !


retraité au soleil
ex-Digital Equipment, ex-Wang, ex-Youpy, ex-IPC, ex-Gefco

Hors ligne

#4 Le 01/07/2017, à 17:29

Watael

Re : [Résolu] read() et le here-string

NON !

read n1 n2 n3 < <(cmd)

et le head est inutile avec awk :

awk 'NR<=3{ print $1 }'

et awk n'est pas indispensable :

$ mapfile -t ar < <(curlGeoIP)
$ ar=( "${ar[@]%% *}" )
$ echo "${ar[0]} - ${ar[1]} - ${ar[2]}"
87.98.175.85 - 93.170.96.235 - 5.135.183.146

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

Hors ligne