j’execute ma commande qui me retourne des lignes comme ça :
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.691 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.606 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.623 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.618 ms
Je voudrais alors pour chaque ligne exécuter une commande du type:
./send_sms.sh numberphone « text »
Ou text est égal à la valeur de time et numberphone est égal à une variable par rapport au numéro de séquence ICMP :
Heu! T’es sûr de ton coup, je reconnais le résultat de la commande ping. Et là du coup tu va envoyer 1 SMS par seconde à autant d’utilisateurs qu’il y aura de secondes.
Pour lire une sortie de commande ligne à ligne je conseille plutôt l’utilisation du format de substitution de processus avec une boucle while (enfin c’est comme ça que je fait)
while IFS=":" read -r A B C D E F
do code=${C##Function}
message=$E
send_sms "${emetteur_tel[${code}]}" "$message"
done < <(nc -l -u 7355 | sox -t raw -esigned-integer -b16 -r 48000 - -esigned-integer -b16 -r 22050 -t
raw - | multimon-ng -t raw -a SCOPE -a POCSAG512 -a POCSAG1200 -a POCSAG2400 -f alpha -)
IFS défini le caractère de séparation
J’ai repris le positionnement des champs en 3eme et 5eme position soit C et E pour les données à récupérer.
${C##Function} récupère tout ce qu’il y a après Function
message=$E récupère la valeur du 3eme champ
${emetteur_tel[${code}]} var chercher la valeur dans le tableau
Attention à ne pas définir le même nom de variable plusieurs fois (emetteur_tel)
Bon voilà c’est très dégrossi, et ça ne va probablement pas marcher du premier coup. Pour les derniers coup de tournevis, mettre des commandes echo pour voir la valeur des variables. Et lancer le script avec le options x et v pour voir la commande executée et son résultat.