La ligne :
[ "$var1" = "1" ] && echo "OK" || echo "KO"
Ne fait probablement pas ce que tu veux qu'elle fasse.
Dans le cas présent, ça fonctionne, mais c'est une mauvaise pratique.
En effet la commande echo "KO" est exécutée si le test échoue ou si la commande echo "OK" échoue. Il faut l'imaginer comme une instruction C classique :
if (var=1 && cmd1() || cmd2()) {}
awk -F " " '{if($2 ~ /^[0-9]+$/){print $2}}' fichier # bonne façon de faire
Contrairement à ce que dis le commentaire ce n'est pas la bonne façon de faire.
awk -F " " '$2 ~ /^[0-9]+$/{print $2}' fichier # bonne façon de faire
est bien mieux (bien plus dans l'esprit awk).
Dans la partie « Éviter les processus inutiles », il faudrait à mon humble avis :
- expliquer qu'utiliser les fonctionnalités avancées de bash cassent la compatibilité (des fois entre version de bash)
- parler de ce mauvais cas d'usage qui est de remplacer dirname par ${var%/*} et basename par ${var##*/} (essayer avec var='/' et avec var='toto.h')
De plus si pour les cas présents oui il faut éviter les processus inutiles, il y a des fois où il vaut mieux briser un traitement pour profiter de la puissance des pipes. Si un traitement prend un temps x, un passage par un pipe peut faire diviser ce temps par deux avec 2 processus bien séparés (il y a un overhead lié à l'utilisation du pipe à prendre en compte). Si le traitement d'une entrée prend alors un peu plus de temps (le temps initial plus l'overhead), le débit peut augmenter sensiblement.
Partager