2010-11-21 10 views
3

İşte benim komut dosyası:Bash'in kedisi, izin verir ve boru garip bir kapsam belirleme davranışına yol açar.

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

while döngüsündeki eko ifadesinin artan değeri basmasına rağmen, son satır eko ifadesi 0 dosyadaki satır sayısı yerine.

Sorun boru ile ilgilidir, çünkü basit bir döngü ile son eko bildirimi doğru değeri basar. Bunu nasıl çalıştırabilirim?

cevap

4

Eğer süreç ikame kullanmak ve geçici dosyayı önleyebilirsiniz ve while döngüsünde değişkenler korunur: tac: Bir komutla

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

Örnek: yerine aşağıdaki kodu kullanın .

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

Boruları kullanırken, yeni bir alt kabuk oluşturulur ve içindeki değişkenler sonra kaybolur. , Bash

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

Teşekkürler, ancak dosyayı tersten okuyarak da okumak istiyorum. Bunu kullanarak yapabilir miyim ... subb

+0

Hayır, maalesef değil. Bir geçici çözüm olarak, dosyanın içeriğini geçici bir dosyada çıkarabilir ve içeriğini buradan okuyabilirsiniz. Cevabımı bir örnekle güncelleyeceğim. – Lekensteyn

+0

Teşekkürler! Bunu düşünmemiştim. – subb

İlgili konular