Linux : changer le séparateur dans une boucle for

Publié le 28 December 2018

Admettons que j’ai un fichier qui contienne :

Linux, y’a moins bien mais c’est plus chère.
rm -fr en root, system dans la choucroute.

Faisons une boucle for basique dessus :

for i in `cat fichier.txt`
do
  echo $i
done

Le résultat ne correspond pas à ce à quoi on pourrait s’attendre :

Linux,
y’a
moins
bien
mais
c’est
plus
chère.
rm
-fr
en
root,
system
dans
la
choucroute.

La raison est simple, la boucle for prends comme séparateur les retours à la ligne, mais aussi les espaces, les tabulations et tous les autres caractères du style. Heureusement, la variable d’environnement $IFS (comme Internal Field Separator) permets de fournir sa propre liste de séparateurs. Il suffit de faire :

IFS=$'\n'
for i in `cat fichier.txt`
do  
  echo $i
done

Le résultat correspond à ce qui est attendu :

Linux, y’a moins bien mais c’est plus chère.
rm -fr en root, system dans la choucroute.