[英]Division in bash script
我有以下脚本:
#!/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
,但是出了点问题...
您正在将PorcUsado
分配为scale=2;UsadoMem/TotalMem
,然后将该分配的输出( scale=2;UsadoMem/TotalMem
)输送到bc
。 您可能希望在命令替换中使用管道,例如(使用here字符串而不是管道):
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"
为什么要管top
输出呢? 似乎太昂贵了。
$ read used buffers < <(
awk -F':? +' '
{a[$1]=$2}
END {printf "%d %d", a["MemTotal"]-a["MemFree"], a["Buffers"]}
' /proc/meminfo
)
当然,如果您重视简洁而不是可读性,那么它很容易成为一线客。
我认为管道是问题,请尝试以下操作:
PorcUsado=$(echo "scale=2;$UsadoMem/$TotalMem" | bc -l)
我还没有测试过,但是您必须回显字符串并将结果从echo
发送到bc
。
编辑 :更正变量名称
您不需要grep
或bc
,因为awk
可以自己搜索和做数学运算:
top -n 1 -l 1 | awk '/Mem/ {printf "%0.2f\n",$8/$4;exit}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.