2011-05-31 50 views
1
VAR=0; 
awk /^Shared/'{print $2}' /proc/$1/smaps | while read -r LINE; do 
    VAR=`expr $LINE + $VAR`; 
    echo "=> "$VAR; 
done 
echo "Shared TOTAL = "$VAR 

在上面的腳本中,我需要計算累積值並將其存儲在變量'VAR'中。 該值在while循環中回顯時確實反映出來,但是因爲循環中斷VAR變爲0.外殼腳本:變量值反映不正確

請建議soluion或任何解決方法。

謝謝。

回答

2

這是因爲您的pipe-in​​to-while運行在子shell中,並且不能以任何方式影響父級。這就是爲什麼父母無法看到$VAR的價值。解決方法是使用進程替換擺脫管道:

VAR=0; 
while read -r LINE; do 
    VAR=`expr $LINE + $VAR`; 
    echo "=> "$VAR; 
done < <(awk /^Shared/'{print $2}' /proc/$1/smaps) 
echo "Shared TOTAL = "$VAR 

,你的輸出存儲在一個臨時變量:

TMPVAR=$(awk /^Shared/'{print $2}' /proc/$1/smaps) 
VAR=0; 
while read -r LINE; do 
    VAR=`expr $LINE + $VAR`; 
    echo "=> "$VAR; 
done <<< "$TMPVAR" 
echo "Shared TOTAL = "$VAR 

,使用臨時文件:

awk /^Shared/'{print $2}' /proc/$1/smaps > tmp 
VAR=0; 
while read -r LINE; do 
    VAR=`expr $LINE + $VAR`; 
    echo "=> "$VAR; 
done < tmp 
rm tmp 
echo "Shared TOTAL = "$VAR 
3

這不能簡化爲t他的awk-one-liner? Awk知道如何遍歷文件或其他輸入(這是它設計的目的);不需要用於該:-)

awk /^Shared/'{print $2;sum += $2} END {print "Shared TOTAL="sum} ' /proc/$$/smaps 

使用當前殼作爲一個例子的PID的單獨迴路中,在可用的$$(即bash)的