Bash

使用從heredoc的標準輸入讀取定義變數

  • January 13, 2019

我正在嘗試將可用記憶體和總記憶體儲存到腳本文件中的變數中,如下所示,

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]

為什麼forst範例不起作用?為什麼第二個有效?

awk命令在兩個單獨的行上列印兩個值,同時read讀取一行,期望在其上找到兩個欄位。

print將命令更改為print $7, $2;在同一行上列印數字。由於您使用 Bash 標記了它,因此您可以使用 here-string 而不是 here-doc 來使完整的命令更簡潔:

$ 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,如果它還沒有的話。

引用自:https://unix.stackexchange.com/questions/494241