2017-07-27 53 views
0

我正在嘗試觀察並輸出較長腳本的進度。 (稍後我想用Progress來計算進度條)。我在bash中使用全局變量while + pipe會出現什麼問題?

這裏是一個縮短的例子:

#!/bin/bash 

PROGRESS=0 

updateprogress() { 
    PROGRESS=$((PROGRESS + 1)) 
    echo $PROGRESS 
} 

<do something> 
updateprogress 

sudo cat /root/.virtualMachines | while read -r name ipAddr  # <-7 lines 
do 
    <do something> 
    updateprogress 
done 

sudo cat /root/.virtualServices | while read -r name ipAddr  # <-3 lines 
do 
    <do something> 
    updateprogress 
done 

什麼我現在想到會是這樣

1 <-# before the first while) 
2 
3 
4 
5 
6 
7 
8 <-# end of first while) 
9 
10 
11 <-# end of second while) 

輸出,但我得到的是

1 <-# before first while) 
2 
3 
4 
5 
6 
7 
8 <-# end of first while 
2 
3 
4 <-# end of second while 

所以這個問題有是關於全局/局部範圍的東西,但我怎樣才能只使用我在頂部定義的全局變量$ PROGRESS所有函數調用?

+2

是否存在涉及的管道?例如。 '命令|而...' – choroba

+0

是的確的它是我將它更新到我的問題 – derHugo

+0

感謝您的問題;)我認爲與您的輸入我找到了答案[這裏](https://stackoverflow.com/questions/16854280/一個不可修改的內部循環不記得) – derHugo

回答

0

管道創建一個新的上下文來執行傳遞給它的插入。如果添加以下行的代碼,您會看到警告:

#beggining of your code ... 
#second while loop 
sudo cat /root/.virtualServices | while read -r name ipAddr (3 times) 
do 
    <do something> 
    updateprogress 
done 
echo $PROGRESS #will display '2' 

爲了解決這個問題,你應該重構你的while環路而不需要管,如下:

while read -r name ipAddr 
do 
    #some instructions 
done < "path/to/the/file" 

使用流重定向不會創建新的上下文,並會產生您期望的結果

+1

嘿謝謝:)我只需要修改一個細節:因爲我必須使用sudo我做了這樣'完成<<< $ (sudo cat /root/.virtualMachines)' – derHugo

+0

作爲一種解決方法,它工作正常。否則,你可以保留我的版本並用sudo調用整個腳本,它應該可以正常工作。如果您只希望使用提升的權限執行文件訪問,而不是腳本的其餘部分,請保留您的版本。 – Aserre

+0

好吧,我會在稍後使用它。我仍然在寫它並刪除一些文件等,而不願意以root身份運行整個事情。 Butanyway感謝您的幫助!它現在正常工作 – derHugo