Dites que j'ai ce fichier:
hello
world
hello world
Ce programme
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
les sorties
tester: hello
tester: world
tester: hello
tester: world
Je voudrais avoir l' for
itération sur chaque ligne individuellement en ignorant les espaces, c'est-à-dire que les deux dernières lignes doivent être remplacées par
tester: hello world
L'utilisation de guillemets for i in "$(cat $1)";
entraîne l' i
attribution de l'ensemble du fichier à la fois. Que devrais-je changer?
la source
<
faire une boucle complète. Bien que ce soit parfaitement logique maintenant, je l'ai vuIFS \ read -r line' in second example. Is really
IFS = `nécessaire? IMHO il suffit de dire:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
désactive la suppression des espaces de début et de fin. Voir Inwhile IFS= read..
, pourquoi IFS n'a aucun effet?Pour ce que cela vaut, je dois le faire assez souvent, et je ne me souviens jamais de la manière exacte d'utiliser
while IFS= read...
, alors j'ai défini la fonction suivante dans mon profil bash:Cette fonction détermine d’abord le nombre de lignes du fichier, puis utilise
sed
pour extraire ligne après ligne, puis transmet chaque ligne sous la forme d’un argument de chaîne unique à une fonction donnée. Je suppose que cela peut devenir vraiment inefficace avec des fichiers volumineux, mais cela ne m'a pas posé de problème jusqu'à présent (suggestions sur la manière d'améliorer cet accueil bien sûr).L'utilisation est assez douce IMO:
la source