2010-11-21 6 views
3

Alors, voici mon script:chat de Bash, alors, laissez et le tuyau conduisant à un comportement de cadrage étrange

count=0 
cat myfile | while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done 
echo $count 

La dernière sortie echo 0 au lieu du nombre de lignes dans le fichier, bien que la déclaration d'écho dans la while loop imprime la valeur d'incrémentation.

Le problème est avec la tuyauterie, car, avec une simple boucle while, la dernière instruction echo imprime la valeur correcte. Comment puis-je faire en sorte que cela fonctionne?

Répondre

4

Dans Bash, vous pouvez utiliser la substitution de processus et d'éviter le fichier temporaire et les variables dans la boucle while seront conservés .

count=0 
while read -r line # you should almost always use -r 
do 
    #some stuff... 
    ((count++)) # alternative form 
    echo $count 
done < <(tac myfile) 
echo $count 
2

Lors de l'utilisation de tuyaux, un nouveau sous-shell est créé et toutes les variables qu'il contient sont perdues après lui. Utilisez plutôt le code suivant:

count=0 
while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done < myfile 
echo $count 

Exemple avec une commande: tac:

count=0 
# Create a random file 
tmpfile=$(mktemp) 
tac myfile > $tmpfile 
while read line 
do 
    #some stuff... 
    let count++ 
    echo $count 
done < $tmpfile 
# remove temp file 
rm $tmpfile 
echo $count 
+0

Merci, mais je voudrais aussi lire le fichier à l'envers, en utilisant tac. Puis-je le faire en utilisant ... done subb

+0

Non, malheureusement pas. Pour contourner le problème, vous pouvez afficher le contenu du fichier dans un fichier temporaire et en lire le contenu. Je vais mettre à jour ma réponse avec un exemple. – Lekensteyn

+0

Merci! Je n'y ai pas pensé. – subb