使用从 Heredoc 的 stdin 读取来定义变量

使用从 Heredoc 的 stdin 读取来定义变量

我试图将可用内存和总内存存储到脚本文件中的变量中,如下所示,

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读取一行,期望在其上找到两个字段。

将命令更改printprint $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如果尚未存在的话)。

相关内容