導入
「今日の日付が入ったファイル名を作りたい」「いま何件あるかを変数に入れたい」。こういうとき、コマンドの実行結果そのものを値として使えると一気に便利になります。それが $( ) です。
説明
$(コマンド) と書くと、そのコマンドを実行して、出力結果がその場に埋め込まれます。
#!/bin/bash
TODAY=$(date +%Y-%m-%d)
COUNT=$(grep ERROR logs/app.log | wc -l)
echo "日付: $TODAY"
echo "エラー件数: $COUNT"
echo "作るファイル名: backup-$TODAY.tar.gz"
flowchart LR
A["$(date +%Y-%m-%d)"] --> B["date を実行"] --> C["2026-08-30"] --> D["その場に埋め込まれる"]
date +%Y-%m-%d の + 以降は書式指定です。%Y が年、%m が月、%d が日。date +%Y%m%d なら 20260830 のように区切りなしになります。バックアップのファイル名は、この形が定番です。
パイプを含む長い処理も、まるごと1つの値にできます。$(grep ERROR logs/app.log | wc -l) は「エラー行を数えた結果」が入ります。
古い書き方に
`コマンド`(バッククォート)もあります。意味は同じですが、入れ子にできず読みにくいので、新しく書くときは$( )を使ってください。他人のスクリプトで見かけたら「あぁ古い書き方だな」と読めれば十分です。
やってみよう
スクリプトを実行して、日付と件数が埋め込まれることを確かめましょう。次に echo "ホスト名: $(hostname)" や echo "ファイル数: $(ls | wc -l)" を足して、どんなコマンドでも値にできることを体感してください。
演習
logs/access.log の行数を $( ) で取り出し、アクセス数: 10 の形で表示してください。
ヒント1を見る
行数は wc -l < logs/access.log(または cat logs/access.log | wc -l)で数えられます。
ヒント2を見る
echo "アクセス数: $(cat logs/access.log | wc -l)"