我有以下脚本:
#!/bin/bash
TotalMem=$(top -n 1 | grep Mem | awk 'NR==1{print $4}') #integer
UsadoMem=$(top -n 1 | grep Mem | awk 'NR==1{print $8}') #integer
PorcUsado='scale=2;UsadoMem/TotalMem'|bc -l
echo $PorcUsado
变量PorcUsado
返回空。我搜索bc
的使用,但有些不对劲......
答案 0 :(得分:4)
您将PorcUsado
分配给scale=2;UsadoMem/TotalMem
,然后将该分配的输出(无)汇总到bc
。您可能希望管道在命令替换中,例如(使用here string而不是管道):
PorcUsado=$(bc -l <<<'scale=2;UsadoMem/TotalMem')
但是你还需要评估那些shell变量 - bc
不能为你做这些:
PorcUsado=$(bc -l <<<"scale=2;$UsadoMem/$TotalMem")
请注意使用"
代替'
和$
前缀来允许Bash评估变量。
此外,如果这是整个脚本,您可以完全跳过PorcUsado
变量,让bc
直接写入stdout。
#!/bin/bash
TotalMem=$(top -n 1 | grep Mem | awk 'NR==1{print $4}') #integer
UsadoMem=$(top -n 1 | grep Mem | awk 'NR==1{print $8}') #integer
bc -l <<<"scale=2;$UsadoMem/$TotalMem"
答案 1 :(得分:3)
为什么要输出top
输出?似乎太昂贵了。
$ read used buffers < <(
awk -F':? +' '
{a[$1]=$2}
END {printf "%d %d", a["MemTotal"]-a["MemFree"], a["Buffers"]}
' /proc/meminfo
)
当然,如果你重视简洁性而不是可读性,它很容易成为单行。
答案 2 :(得分:2)
我认为管道问题是尝试这样的事情:
PorcUsado=$(echo "scale=2;$UsadoMem/$TotalMem" | bc -l)
我还没有测试过,但你必须回显字符串并将echo
的结果传递给bc
。
编辑:更正变量名称
答案 3 :(得分:1)
您不需要grep
或bc
,因为awk
可以自行搜索和完成数学运算:
top -n 1 -l 1 | awk '/Mem/ {printf "%0.2f\n",$8/$4;exit}'