Bash
使用從heredoc的標準輸入讀取定義變數
我正在嘗試將可用記憶體和總記憶體儲存到腳本文件中的變數中,如下所示,
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 $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
,如果它還沒有的話。