次のように、使用可能なメモリと合計メモリをスクリプトファイルの変数に保存しようとしています。
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つのフィールドが見つかると予想される行を読み取ると、awk
2つの別々の行に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
、まだ存在しない場合は、出力の末尾に最終改行文字を追加してください。