2010-11-21 12 views
3

因此,這裏是我的腳本:bash的貓,同時,讓和管道引到怪作用域行爲

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

最後echo語句輸出0,而不是在文件中的行數,雖然在echo語句while循環打印增量值。

問題出在管道上,因爲在簡單的while循環中,最後的echo語句會輸出正確的值。我怎樣才能使這個工作?

回答

4

在bash,可以使用進程替換和避免臨時文件並在while循環中的變量將被保留。

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

使用管道時,會創建一個新的子shell,並且其中的任何變量都會丟失。使用下面的代碼,而不是:

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

實施例的命令: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

謝謝,但我還想用tac來讀取文件。我可以用...完成嗎 subb 2010-11-21 09:00:57

+0

不,不幸的不是。作爲一種解決方法,您可以在臨時文件中輸出文件的內容,並從中讀取內容。我會用一個例子更新我的答案。 – Lekensteyn 2010-11-21 09:06:33

+0

謝謝!沒想到這一點。 – subb 2010-11-21 09:35:20