[gull] Truc et astuces: bash: manipulation de chaînes sans boucle for

Félix Hauri felix at f-hauri.ch
Thu Aug 7 13:06:49 CEST 2025


S'il est réputé que bash n'est pas rapide, en évitant/réduisant
au maximum les boucles (while, for, until, ...) et les forks,
on obtient des résultats intéressant (voire brbash, plus bas).

Essayez:

 - https://f-hauri.ch/vrac/manyPing.sh.txt
   How to collect many ping's outputs into bash variables

   A lancer avec des nom d'hôtes en argument.

   Voire en particulier les fonctions `out2var` et `printOut`.
   Lancé avec le switch "-d" permet de voire
     - ce que la commande `sed` produit,
     - la chaine temporaire utilisée pour la variable "${listArps[@]}" et
     - un dump des 6 variables finales.

 - https://f-hauri.ch/vrac/procNetstat.bash.txt
   bash script to pretty show /proc/net/netstat values

   Pour afficher le contenu de /proc/net/netstat de manière lisible
   Petit et rapide, élimine toutes les valeurs nulles et
   afficher les noms et valeurs par lignes, alignées sur
   les largeurs max.

 - https://f-hauri.ch/vrac/scanPingLocalnet.sh.txt
   Scan local net conf, ping whole local net, then run `host`

   D'abord, `ip r g 1.1.1.1` indique le routeur par défaut,
   puis `ip a s` permet de retrouver la config (en particulier
   le mask de sous-réseau).
   De là, on mappe la rangée d'ip dans une chaine style:
     host 192.168.1.1 & host 192.168.1.2 & ... host 192.168.1.254 &
   qui est passée à un `sh` dont la sortie est transformée par `sed` en
     $var[192<<24|168<<16|1<<8|1]="gateway.localnet" $var[192<<24...

   C'est tout.
   On obtient une variable indexée par les valeur entière des IP (atoi),
   contenant les noms, sinon les IPs de toutes les machines du réseau
   local qui ont répondu au ping.

   De là, les fonctions présentes dans manyPing.sh  peuvent être utilisées
   pour la mise en forme.

 - https://f-hauri.ch/vrac/brbash.sh.txt
   Interactive simulation of a 64px heigth prompter, w/Utf8 braille font

   Simulation d'un affichage 64 pixels, avec une ligne qui déroule un
   message et une seconde ligne affichant date et heure (/1000 sec)
   Avec:
    - Redimensionement automatique lorsque la fenêtre est redimensionnée
    - Ecoute d'un FD /proc/$pid/fd/10 dans lequel on peut envoyer un message
    - Lancé sous XTerm, envoie une commande d'exemple dans le clipboard
    - Attend les  intéraction utilisateur via les touches:
       'r'  Rafraichir l'affichage
       'f'  Lance `fortune` pour le nouveau message
       'n'  Attend le nouveau message à entrer au clavier
       'l'  Affiche durant 15 secs, la charge CPU du process, en pourcents
       'q'  Quit.

   Ce script évite autant que raisonnable de faire des boucles. Les seules
   boucles sont de 4 opération pour les 4 lignes d'affichage par ligne de
   text et LA boucle principale qui cadence l'affichage.

Voilà, ce sera tout pour aujourd'hui! Comme d'habitude, vos observation,
commentaire et remarques sont les bienvenues!

PS: J'ai repensé ma librairie "netfunc" https://f-hauri.ch/vrac/netfunc.bash.txt
pour imaginer `ip2int`, `int2ip` et `checkIsIP` capable de traiter leurs
arguments par "mappage" et éviter les boucles. Il faudra que je mette en forme
et que je fasse des mises à jour... Si cela intéresse l'un de vous, n'hésitez
pas à me demander, je peux présenter mes brouillons! 

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list