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]

最初の例がうまくいかないのはなぜですか? 2番目はなぜ動作しますか?

ベストアンサー1

このコマンドは、2つのフィールドが見つかると予想される行を読み取ると、awk2つの別々の行に2つの値を出力します。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が個々の引数として扱われます。空白で連結されたすべての引数を1行に出力します。

echo $(foo)foo一般的に役に立たないことですが、まさにその理由で同じではありません。またfoo、まだ存在しない場合は、出力の末尾に最終改行文字を追加してください。

おすすめ記事