2015-05-02 62 views
0

我有一個逗號分隔的字符串變量,我需要從標準輸入中刪除來自文件的值。當我完成腳本時,值不會從變量中刪除,但可以告訴它們在do循環中被刪除。如何在操作的do循環內更新一個全局變量?內聯操作後bash全局變量未更改

#!/bin/bash 
    varFoo="text1,text2,obit,poodle,text2,text1,doberman,bloodhound,treewalker,breaker,circuit,bum,rush" 
echo text2 > /tmp/fileFeed.txt 
echo circuit >> /tmp/fileFeed.txt 
echo rush >> /tmp/fileFeed.txt 
cat /tmp/fileFeed.txt | while read word; do 
    removeWord=${varFoo//$word,/} 
    removeWord=${removeWord//,$word/} 
    echo ========== transaction seperator ========== 
    echo word=$word 
    echo removeWord=$removeWord 
    varFoo=$removeWord 
done 
echo ^^^^^^^^^^^exiting work loop and heading to the end ^^^^^^^^^^^ 
echo FINAL varFoo = $varFoo 
exit $? 

輸出是

========== transaction seperator ========== 
word=text2 
removeWord=text1,obit,poodle,text1,doberman,bloodhound,treewalker,breaker,circuit,bum,rush 
========== transaction seperator ========== 
word=circuit 
removeWord=text1,obit,poodle,text1,doberman,bloodhound,treewalker,breaker,bum,rush 
========== transaction seperator ========== 
word=rush 
removeWord=text1,obit,poodle,text1,doberman,bloodhound,treewalker,breaker,bum 
^^^^^^^^^^^exiting work loop and heading to the end ^^^^^^^^^^^ 
FINAL varFoo =  text1,text2,obit,poodle,text2,text1,doberman,bloodhound,treewalker,breaker,circuit,bum,rush 

所以,你會發現,循環去除字符串值,但,當它退出循環變量仍然是在進入循環之前的原始值。

+0

衆所周知的問題 - 你有一個子管道,因爲管道。 UUoC的一個缺點(無用的'cat')。你也可以查看'shopt -s lastpipe'。 –

+0

http://mywiki.wooledge.org/BashFAQ/024但在這裏,一個數組似乎是明顯的解決方法。 – tripleee

回答

2

這裏,

cat /tmp/fileFeed.txt | while read word; do 
    .... 
done 

while循環獲取子shell執行。因此,沒有任何變量的值將在循環外部可用。將其更改爲:

while read word; do 
    .... 
done < /tmp/fileFeed.txt 

您可能也有興趣閱讀useless use of cat

+0

這是從返回的陳舊副本。主要位置是http://iki.fi/era/unix/award.html – tripleee