2009-10-07 6 views
1

Je ne peux pas pour la vie de moi voir pourquoi je ne peux pas lire la postPrioity en dehors de la boucle while. J'ai essayé "export postPrioity =" 500 "" ne fonctionnait toujours pas.Impossible de lire la variable qui a été stockée dans une boucle while, while out of the while

Des idées?

- ou dans le texte plan -

#!/bin/bash 
cat "/files.txt" | while read namesInFile; do 
      postPrioity="500" 
      #This one shows the "$postPrioity" varible, as '500' 
      echo "weeeeeeeeee ---> $postPrioity <--- 1" 
done 
      #This one comes up with "" as the $postPrioity varible. GRRR 
      echo "weeeeeeeeee ---> $postPrioity <--- 2" 

SORTIE: (je n'ai que 3 noms de fichiers dans files.txt)

weeeeeeeeee ---> 500 <--- 1 
weeeeeeeeee ---> 500 <--- 1 
weeeeeeeeee ---> 500 <--- 1 
weeeeeeeeee ---> <--- 2 

Répondre

9

L'opérateur de tuyau crée un sous-shell, voir BashPitfalls et BashFAQ. Solution: Ne pas utiliser cat, c'est inutile de toute façon.

#!/bin/bash 
postPriority=0 
while read namesInFile 
do 
    postPrioity=500 
    echo "weeeeeeeeee ---> $postPrioity <--- 1" 
done < /files.txt 
echo "weeeeeeeeee ---> $postPrioity <--- 2" 
+0

Merci pour confirmer ma supposition! Je pense que certaines des solutions de contournement mentionnées à BashFAQ (par exemple, le groupement de commandes) sont de meilleurs paris, bien que votre pipeline ne soit pas inutile. – Cascabel

+1

Bien sûr, les pipelines ne sont pas vides de sens dans tous les cas, mais la construction "fichier cat | ... "devrait dans la plupart des cas être remplacé par" ... Philipp

+0

Je ne le savais jamais, tu en savais un peu plus sur les sous-catégories. Mais ouais malade gardez cela à l'esprit maintenant, et aura une lecture sur ces sites, merci. – Mint

6

En complément à la réponse de Philipp, dans le cas où vous devez utiliser un tuyau (et comme il l'a souligné, dans votre exemple, vous n'avez pas besoin chat), vous pouvez mettre toute la logique du même côté le tuyau:

 

command | { 
    while read line; do 
    variable=value 
    done 
    # Here $variable exists 
    echo $variable 
} 
# Here it doesn't 
 
1

Vous pouvez également utiliser la substitution de processus:

while read line 
do  
    variable=value 
done < <(command) 
Questions connexes