2015-05-04 34 views
0

我使用Ubuntu服務器,你可以看到:簡單的Bash腳本:什麼是錯的?

#uname -a 
Linux grosella 3.13.0-48-generiC#80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 

Supose數據文件像這樣(/tmp/data.txt):

1 AAAA 
2 BBBB 
3 CCCC 
4 DDDD 
5 EEEE 
6 FFFF 

運行以下bash腳本:

typeset -i ACUM=0 
typeset -a V=('') 

cat /tmp/data.txt | \ 
while read LINEA ; do 
    [ "x$LINEA" == "x" ] && break 
    V=($LINEA) 
    VAL="${V[0]}" 
    [ "x$VAL" == "x" ] && continue 
    [[ $VAL =~ ^[0-9]+$ ]] || continue 
    ((ACUM+=VAL)) 
    echo -e "VAL=$VAL\t\tACUM=$ACUM" 
done 

echo -e "\nFinal Result: $ACUM" 

這裏是打印輸出:

VAL=1  ACUM=1 
VAL=2  ACUM=3 
VAL=3  ACUM=6 
VAL=4  ACUM=10 
VAL=5  ACUM=15 
VAL=6  ACUM=21 

Final Result: 0 

而不是21,最終的結果是0.什麼是錯的?

+5

http://mywiki.wooledge.org/BashFAQ/024 –

+2

Boo/hiss在提出問題之前沒有更好地描述您的問題。 (另請參閱http://stackoverflow.com/help/mcve) –

回答

2

cat /tmp/data.txt | \ 
while read LINEA ; do 
    # ... 
done 

更改代碼

while read LINEA ; do 
    # ... 
done < /tmp/data.txt 

以避免出現兩個子shell都有自己的環境。

+0

我做到了......對我來說,問題解決了! – abadjm

3

當您將數據傳輸到您的while循環中,該循環創建while循環運行的子shell。子shell不能更改父級的環境變量,所以外部ACUM不會更改。

+0

這很棒! ...謝謝 – abadjm