Vous pouvez faire ce qui suit while read
qui sera alimentée par le résultat de la boucle grep
en utilisant ce qu'on appelle la substitution de processus :
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
De cette façon, vous n'avez pas à stocker le résultat dans une variable, mais à "injecter" directement sa sortie dans la boucle.
Notez l'utilisation de IFS=
y read -r
conformément aux recommandations de BashFAQ/001 : Comment lire un fichier (flux de données, variable) ligne par ligne (et/ou champ par champ) ? :
L'option -r pour la lecture empêche l'interprétation des barres obliques inverses (habituellement utilisée comme une paire de backslashs newline, pour continuer sur plusieurs lignes ou pour échapper aux délimiteurs). Sans cette option, toutes les barres obliques inverses non masquées dans l'entrée sera éliminé. Vous devriez presque toujours utiliser l'option -r avec read.
Dans le scénario ci-dessus, IFS= empêche de couper les espaces blancs de tête et de queue. d'espacement. Supprimez-la si vous souhaitez obtenir cet effet.
En ce qui concerne la substitution de processus, elle est expliquée dans le document intitulé page des hackers bash :
La substitution de processus est une forme de redirection où l'entrée ou le d'un processus (une séquence de commandes) apparaît comme un fichier temporaire. temporaire.