2017-05-13 153 views
1

更改變量我正在寫入的警告到標準輸出的命令,我想我的腳本停止對這些警告,因此拼湊了很多東西,我在這裏學到的,我有以下。 ..在shell腳本循環

warnd=false; 
    myLongCommand | 
    while IFS= read -r line 
    do 
     if [[ $line == *"WARNING in ."* ]]; then 
      warnd=true; 
      echo "found a warning!!!!!" 
      break 
     fi 
     echo $line 
    done 
    echo WARNING IS $warnd 
    if [[ "$warnd" == true ]]; then 
     echo "exiting due to warning" 
     exit 
    else 
     echo "no warnings" 
    fi 

但是,這並不如我所料。當myLongCommand寫入警告時,我看到以下回顯:...

發現警告!!!!!

警告是假的

沒有警告

爲什麼不是改變我在循環後看到warnd變量。我讀過有關shell腳本變量的作用域,但似乎沒有任何表明該循環內的變量具有不同的範圍。

+1

變化'myLongCommand |對於;請; done'到'對;待辦事項;完成<<(mylongcommand)'。管道打開一個子shell,並且當它完成關閉它,導致子shell設置任何變量丟失。 – 123

回答

1

您正在管道中運行該命令並修改一個變量,不是在由管道線創建的子shell終止後生效。使用合適的工藝替代技術與while循環,

while IFS= read -r line 
do 
    if [[ $line == *"WARNING in ."* ]]; then 
     warnd=true; 
     echo "found a warning!!!!!" 
     break 
    fi 
done< <(myLongCommand) 

值得一讀這BashFAQ - 024 - I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?

一個簡單的例子,從鏈接的頁面引用,

linecount=0 

printf '%s\n' foo bar | 
while IFS= read -r line 
do 
    linecount=$((linecount + 1)) 
done 

echo "total number of lines: $linecount" 

所以理想的預期值所述lineCount2但是由於變量是在由管道線產生的子殼更新時,更新不一旦子shell退出反映。

僅供參考,上述小片段產生一個輸出作爲

total number of lines: 0 
+0

謝謝。這個解決方案對我不起作用,但它讓我走上了正軌。 (DUP也沒有幫助我)。我在那條完成的行上出現了意外令牌附近的語法錯誤'<''。我固定的方式是用花括號將所有命令都包裹在命令後面。感謝您讓我走上正軌! – user1272965

+0

@ user1272965:快樂是幫助。你沒有讓我們知道你的命令,否則我們可以發現它是否有任何問題。但是我的回答是在更新變量時避免管道的一般方法。 – Inian