繁体   English   中英

bash脚本中的除法

[英]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

编辑 :更正变量名称

您不需要grepbc ,因为awk可以自己搜索和做数学运算:

top -n 1 -l 1 | awk '/Mem/ {printf "%0.2f\n",$8/$4;exit}'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM