我有一個Bash腳本,我想在其中計算在循環文件時完成了多少操作。計數似乎在循環內起作用,但在此之后,變量似乎已重置。nKeys=0cat afile | while read -r linedo #...do stuff let nKeys=nKeys+1 # this will print 1,2,..., etc as expected echo Done entry $nKeysdone# PROBLEM: this always prints "... 0 keys"echo Finished writing $destFile, $nKeys keys上面的輸出僅是以下幾行的內容:完成輸入1完成輸入2完成寫/ blah,0鍵我想要的輸出是:完成輸入1完成輸入2完成寫/ blah,2鍵我不太確定為什么循環后nKeys為0 :(我認為這是基本的東西,但是盡管我看了http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html,但還是能認出它,但該死的和其他資源。手指交叉著別人可以看著它,然后走開,“嗯!你必須……”!
3 回答

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
在剛剛發布的Bash 4.2中,您可以執行以下操作以防止創建子外殼:
shopt -s lastpipe
另外,您可能會在Ignacio提供的鏈接中看到,您對的無用cat。
while read -r line
do
...
done < afile

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
如已接受的答案中所述,這是因為管道產生了單獨的子流程。為避免這種情況,command grouping一直是我的最佳選擇。也就是說,在子外殼中的管道之后進行所有操作。
nKeys=0
cat afile |
{
while read -r line
do
#...do stuff
let nKeys=nKeys+1
# this will print 1,2,..., etc as expected
echo Done entry $nKeys
done
# PROBLEM: this always prints "... 0 keys"
echo Finished writing $destFile, $nKeys keys
}
現在它將報告$nKeys“正確” 的值(即您希望的值)。
添加回答
舉報
0/150
提交
取消