お兄ちゃん!
コマンドの出力を
変数の値にしたいんだけど
できそうでできないんだ…
それは
「コマンド置換
(command substitution)」
の出番だね
コマンド出力を
文字列にしてくれるんだ!
へぇ…
さっそく試してみようよ!
nproc は
CPU のコア数を
表示するよ
nproc [オプション]...
重要なオプションはないのでそのまま実行してみよう!
nproc
うん!
4
このシステムにはCPU のコアが4つあるんだね!
この結果を
CORES 変数に保存してみよう!こう書けばいいんだよね?
CORES=4
確かにコアの数は保存できたけど…これだと毎回
nproc で調べて値を指定しなきゃいけないよね私のやりたかったことには届いていない感じかなそこで便利なのがコマンド置換だよ以下のようにコマンドを「バッククォート( で囲むと コマンドの出力がそのまま文字列となって変数の値として使えるんだ
`)」CORES="`nproc`"
これで本当に
CORES の値が4 になったのかな?それは以下のコマンドで確認してみよう!
echo "$CORES"
なるほど…
echo で変数の値を表示して確認できるのね!4
本当だ!ちゃんと
4 と表示されたよ!$( ... ) でのコマンド置換バッククォートは古い書き方なんだ
最近のシェルでは代わりに
$(コマンド) と書くよCORES="$(nproc)"
こっちの書き方だとコマンド置換の始まりと終わりが分かりやすいね!
他にもクォートの入れ子も柔軟に解釈してくれるんだ
MESSAGE="$(echo "hello, $USER")"
ただダブルクォートの出現順で判断するのではなく
"$( ... )" の中に"hello, ..." があると賢く判断してくれるんだねなので可能なら
$( ... ) でコマンド置換を書くようにしよう!お兄ちゃんはシェル変数やコマンド置換をいつも「ダブルクォート( で 囲んでいるよね?
")」よく気が付いたね!意識的にそうしているんだよ
そうすることで何かいいことがあるのかな?
")」例えば
"$(コマンド)" としたときにコマンドが何も出力しなくても空文字になるしrmdir "$DIR" を実行したときにDIR 変数の値が Program Files とスペースが含まれていても問題ないんだコマンド置換は高度な操作でよく使われるよ
$( ... ) でコマンドを文字列に置き換えよう