将Bash命令返回设置为变量

时间:2012-11-19 16:26:20

标签: perl bash

如果我们可以在Perl中执行此操作,那也没关系。 我不知道这是否可能,但这是我想要做的。我正在尝试使用内存占用的内存百分比(可能有更好的方法,请告诉我)

我有这个bash命令

free -m | grep "Mem: " | awk '{print ($3/$2)*100}' 

这将返回一个数字,但我想要做的是将一个变量设置为命令的输出。

So var1= Output of the above command

4 个答案:

答案 0 :(得分:5)

我相信这就是你要找的东西:

var1=$(free -m | grep "Mem: " | awk '{print ($3/$2)*100}')

<强>解释

  • $(...)语法在shell中称为命令替换。
  • 它生成一个子shell来执行括号内的任何内容,然后将在子shell中打印出来的任何内容返回到stdout

<强>除了:

替代语法是使用反引号:

var1=`free -m | grep "Mem: " | awk '{print ($3/$2)*100}')`

但由于可读性和嵌套问题,它不是首选方法。

答案 1 :(得分:4)

如果您使用grep,则无需使用awk。您可以将命令简化为:

var1=$(free -m | awk '/Mem:/{print ($3/$2)*100}')

答案 2 :(得分:0)

您可以在命令上使用反引号:

export var=`command`

答案 3 :(得分:0)

如果您正在使用Linux(或任何具有兼容/ proc接口的Unix),您可以通过这种方式获得已用内存的百分比:

var1=$(perl -ne '/(\w+):\s*(\d+)/ and ($mem{$1} = $2) }{ printf "%0.2f", 100 - 100 * $mem{MemFree} / $mem{MemTotal}' /proc/meminfo)

注意,减去缓冲区和放大器通常是一个好主意。缓存(操作系统缓存往往会填满所有可用的RAM):

var2=$(perl -MList::Util=sum -ne '/(\w+):\s*(\d+)/ and ($mem{$1} = $2) }{ printf "%0.2f", 100 - 100 * sum(@mem{qw{Buffers Cached MemFree}}) / $mem{MemTotal}' /proc/meminfo)