2011-11-10 4 views
2

un simple test variable:reset variable dans un script bash

#!/bin/bash 

N=0 

ls -l | while read L; do 
N=$((N+1)) 
echo $N 
done 

echo "total $N" 

a couru ensuite sortie:

1 
2 
3 

total 0 

i attendu finale N = 3: "un total de 3", mais pourquoi la valeur réinitialiser à 0 après la boucle?

+1

résolu comme un problème de sous-shell connu. consultez http://stackoverflow.com/questions/5006229/why-does-my-bash-counter-reset-after-while-loop – sof

+0

vous pouvez remplacer le $ ((N + 1)) par ((N ++)) avec le même résultat – ata

Répondre

8

bash exécute chaque instruction dans un tube dans son propre sous-shell. (Pour les commandes externes telles que ls le sous-shell simplement la commande exec s). Ceci rend effectivement toutes les variables locales. Vous devez généralement contourner ce problème en utilisant la redirection ou la substitution de commandes au lieu d'un canal.

EDIT: Cela semble fonctionner:

#!/bin/bash 
IFS= 
N=0 

while read L; do 
    N=$((N+1)) 
    echo $N 
done <<<$(ls -l) 

echo "total $N" 
+0

tuyau, sous-shell et solution de contournement. Gotcha, merci! – sof

Questions connexes