Comment itère-t-on correctement sur les lignes en bash, que ce soit dans une variable ou à partir de la sortie d'une commande? Il suffit de définir la variable IFS sur une nouvelle ligne pour fonctionner avec la sortie d'une commande mais pas pour traiter une variable contenant des nouvelles lignes.
Par exemple
#!/bin/bash
list="Un\ndeux\ntrois\nquatre"
#Afficher la liste avec echo
echo -e "echo: \n$list"
#Définir le séparateur de champ sur une nouvelle ligne
IFS=$'\n'
#Essayer d'itérer sur chaque ligne
echo "Pour la boucle :"
for item in $list
do
echo "Élément: $item"
done
#Sortir la variable dans un fichier
echo -e $list > list.txt
#Essayer d'itérer sur chaque ligne à partir de la commande cat
echo "Pour la boucle sur la sortie de la commande :"
for item in `cat list.txt`
do
echo "Élément: $item"
done
Cela donne la sortie:
echo:
Un
deux
trois
quatre
Pour la boucle :
Élément: Un\ndeux\ntrois\nquatre
Pour la boucle sur la sortie de la commande :
Élément: Un
Élément: deux
Élément: trois
Élément: quatre
Comme vous pouvez le constater, l'affichage de la variable ou itérer sur la commande cat
imprime correctement chaque ligne séparément. Cependant, la première boucle for
imprime tous les éléments sur une seule ligne. Des idées?
0 votes
Juste un commentaire pour toutes les réponses : j'ai dû faire $(echo "$line" | sed -e 's/^[[:space:]]*//') pour supprimer le caractère de saut de ligne.