我试图将可用内存和总内存存储到脚本文件中的变量中,如下所示,
read -r Available Total <<EOT
$(free -m | awk '/^Mem/{print $7; print $2;}')
EOT
$ echo $Total
$ echo $Available
1437
但我无法存储变量 $Total。
但是当我这样做时:
$ read Available Total <<EOT
$(echo $(free -m | awk '/^Mem/{print $7; print $2;}'))
EOT
$ echo $Available
1309
$ echo $Total
7865
有用。但 shellcheck 给了我以下建议:
Useless echo? Instead of 'echo $(cmd)', just use 'cmd'. [SC2005]
为什么第一个例子不起作用?为什么第二个有效?
答案1
该awk
命令将两个值打印在两个单独的行上,同时read
读取一行,期望在其上找到两个字段。
将命令更改print
为print $7, $2;
在同一行上打印数字。由于您使用 Bash 对其进行了标记,因此您可以使用此处字符串而不是此处文档来使完整命令更简洁:
$ read -r Available Total <<< $( free -m | awk '/^Mem/{print $7, $2;}' )
或者使用进程替换:
$ read -r Available Total < <( free -m | awk '/^Mem/{print $7, $2;}' )
如果在命令替换周围使用echo $(...)
不带引号的命令,则命令的输出将进行分词,并将echo
单独的行视为单独的参数。它打印所有用空格连接的参数,所以在一行上。
echo $(foo)
foo
通常是一件无用的事情,但正是因为这个原因,它并不相同。它还会在 的输出末尾添加最后一个换行符(foo
如果尚未存在的话)。