Shell脚本:变量值无法正确反映

时间:2011-05-31 12:10:13

标签: shell

 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。

请提示解决方案或任何解决方法。

感谢。

2 个答案:

答案 0 :(得分:3)

这个awk-one-liner不能简化吗? awk知道如何循环文件或其他输入(这是它的设计目的);不需要单独的循环: - )

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

使用当前shell的pid作为示例,可在$$(即bash)

中找到

答案 1 :(得分: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