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。
请提示解决方案或任何解决方法。
感谢。
答案 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-into-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