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