在bash脚本中划分

时间:2017-10-29 22:33:29

标签: linux bash shell

我有以下脚本:

#!/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的使用,但有些不对劲......

4 个答案:

答案 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)

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

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