$()(コマンド置換)
コマンド置換(『$()』)はコマンドの実行結果を文字列として別の場所に埋め込みます。変数への代入・別コマンドの引数・echo での出力など幅広い場面で使えます。
構文
コマンド置換(推奨)。
$(コマンド)
バッククォート(旧式・非推奨)。
`コマンド`
変数への代入。
変数=$(コマンド)
コマンドの引数として使います。
コマンド1 $(コマンド2)
ネストします($() はネストが容易です)。
$(コマンド1 $(コマンド2))
使用パターン一覧
| パターン | 概要 |
|---|---|
| var=$(cmd) | コマンドの標準出力を変数に代入します。末尾の改行は自動削除されます。 |
| echo "今日: $(date)" | 文字列の中にコマンド結果を埋め込みます。 |
| for f in $(ls *.txt) | コマンドの出力をリストとして for ループで処理します。 |
| $(cmd1 $(cmd2)) | ネストしたコマンド置換です(バッククォートではネストが難しい)。 |
| files=$(find . -name "*.php") | 複数行の出力も1つの変数に格納できます。 |
サンプルコード
コマンドの実行結果を変数に代入します。
date_var.sh
today=$(date +%Y-%m-%d) echo "今日の日付: $today"
bash date_var.sh 今日の日付: 2026-03-06
whoami_var.sh
current_user=$(whoami) echo "実行ユーザー: $current_user"
bash whoami_var.sh 実行ユーザー: alice
ファイル数のカウントなど、コマンドの結果をそのまま使えます。
count_php.sh
php_count=$(find . -name "*.php" | wc -l) echo ".php ファイル数: $php_count"
bash count_php.sh .php ファイル数: 42
文字列の中にコマンド結果を埋め込みます。
echo "ホスト名: $(hostname), ユーザー: $(whoami)" ホスト名: myserver, ユーザー: alice
コマンドの出力をファイル名に使います。
logname.sh
log_file="app_$(date +%Y%m%d_%H%M%S).log" echo "ログファイル: $log_file"
bash logname.sh ログファイル: app_20260306_143022.log
ネストしたコマンド置換です。『$()』はバッククォートと違いネストが容易です。
nested.sh
largest=$(basename $(ls -S | head -1)) echo "最大ファイル: $largest"
bash nested.sh 最大ファイル: index.php
for ループと組み合わせてファイルを一覧処理します。
list_php.sh
echo "--- PHP ファイル一覧 ---"
for f in $(find . -maxdepth 1 -name "*.php" | sort); do
size=$(wc -c < "$f")
echo "$f: ${size}バイト"
done
bash list_php.sh --- PHP ファイル一覧 --- ./ajax.php: 8340バイト ./index.php: 5120バイト
なお、for 文はターミナルでも直接入力できます。『do』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『done』を入力すると実行されます。
for f in $(find . -maxdepth 1 -name "*.php" | sort); do
size=$(wc -c < "$f")
echo "$f: ${size}バイト"
done
./ajax.php: 8340バイト
./index.php: 5120バイト
複数行の出力を変数に格納して処理します。
count_dirs.sh
dirs=$(find . -maxdepth 1 -type d) echo "ディレクトリ数: $(echo "$dirs" | wc -l)"
bash count_dirs.sh ディレクトリ数: 8
概要
コマンド置換の結果は末尾の改行が自動的に削除されます。複数行の出力を変数に格納する場合は行が保持されますが、ダブルクォートなし(『$変数』)で展開すると改行がスペースに変換されます。複数行を1行ずつ処理するには『"$変数"』でクォートして while read ループに渡します。
バッククォート(『`cmd`』)はネストが難しく視認性も低いため、現代のスクリプトでは『$()』を使うのが推奨です。
コマンドの出力を別コマンドに引数として渡すには xargs も有用です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。