お兄ちゃん!
コマンドの出力を
変数の値にしたいんだけど
できそうでできないんだ…
リダイレクトやパイプ、
プロセス置換じゃないよね?
それは
「コマンド置換
(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
とスペースが含まれていても問題ないんだコマンド置換は高度な操作でよく使われるよ
$( ... )
でコマンドを文字列に置き換えよう