mardi 7 août 2012

bash, boucles for

En bash, on aurait tendance à penser que "for line in $(cat fichier)" renvoie les lignes mais c'est faux car les séparateurs par défaut sont les espaces, tabulations... On itère donc sur la liste des mots...

Pour palier à ce soucis, on peut jouer en modifiant la variable IFS et en la restaurant ensuite.

Cela donne :
old_IFS=$IFS     
IFS=$'\n'      
for line in $(cat fichier)        
do        
   echo "La ligne est : $line"
done        
IFS=$old_IFS    
Une méthode plus subtile mais tout aussi jolie est d'utiliser read et while... Cela donne maintenant :
cat fichier | while read line || [[ $line ]]
do        
   echo "La ligne est : $line"
done        


C'est quand même moins tordu ;)

A noter, le [[ $line ]] permet de prendre en compte la dernière ligne s'il n'y a pas de retour chariot.