2011-05-31 49 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)的