コメント(#)
シェルスクリプト(bash/zsh/sh)でコメントを書く方法です。『#』(シャープ)が唯一のコメント記法です。『#』以降、行末まですべてコメントになります。例外として、ファイルの1行目に書く『#!/bin/bash』(シバン行)は、コメントと同じ記法ですが、実行するシェルをシステムに伝える特別な行です。
構文
#!/bin/bash # シバン行 — ファイルの1行目に書き、このスクリプトを実行するシェルを指定します。 # シバン行はコメントと同じ # 記法ですが、OS がシェルを選択するために使います。 # 一行コメント — # 以降、行末まですべてコメントになります。 # コードの右側に行末コメントを書くこともできます。 result=0 # 計算結果を初期化します # 複数行コメントを書くには、各行に # を付けます。 # シェルスクリプトには /* */ のような複数行コメント構文はありません。 # ヒアドキュメントを使って複数行コメントを模倣することもできます(後述)。
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | # テキスト | 行頭から書く場合も、コードの右側に書く場合も同じ記法です。『#』以降、行末まですべてコメントになります。 |
| シバン行 | #!/path/to/shell | ファイルの1行目にのみ書きます。コメントと同じ記法ですが、OS(カーネル)がスクリプトを実行するシェルを選択するために読み取る特別な行です。 |
| ヒアドキュメント(複数行コメント代替) | : <<'EOF'...EOF | コロン(ヌルコマンド)とヒアドキュメントを組み合わせた慣用句です。複数行のコメントとして使われることがありますが、一般的ではありません。 |
シバン行の書き方
シバン行(shebang、shabang、hashbang とも呼ばれます)はスクリプトを実行するシェルを指定します。ファイルの1行目に書き、2行目以降には書けません。
| シバン行 | 説明 |
|---|---|
| #!/bin/bash | bash を直接指定します。bash の拡張機能(配列・[[条件式]]等)を使う場合に選択します。 |
| #!/bin/sh | システムの sh(POSIX 準拠シェル)を指定します。移植性を重視する場合に使います。 |
| #!/usr/bin/env bash | PATH から bash を探して実行します。bash がシステムの /bin/ にない場合(macOS の Homebrew 等)に対応できます。 |
| #!/usr/bin/env zsh | zsh を PATH から探して実行します。 |
| #!/usr/bin/env python3 | Python スクリプトに付けます。シェルスクリプトに限らず、任意のインタープリター言語で使えます。 |
コメントを置く場所のパターン
| パターン | 場面 | 補足 |
|---|---|---|
| コメントを残す | スクリプトの先頭:目的・引数・使用例 | スクリプトを後から読む人が使い方を把握しやすくなります。man ページが用意されていない小さなスクリプトでよく使われるパターンです。 |
| コメントを残す | 「なぜこのオプションを付けたか」 | find の -maxdepth や curl の -L など、デフォルトでない動作をするオプションの理由を残しておくと、後で変更する際に参照できます。 |
| コメントを残す | 複雑なパイプラインや正規表現 | 長い awk / sed / grep のパイプラインは意図が読み取りにくいため、処理の概要をコメントで補足するパターンがあります。 |
| コメントを残す | 一時的なコメントアウト | コマンドを無効化した理由・期限・再有効化の条件を残しておくと、削除し忘れを防げます。 |
| 冗長になりやすい | コマンド名から明らかな処理 | 『# ディレクトリを作成します』の前に mkdir を書くパターンは情報が重複しがちです。 |
| 冗長になりやすい | 変更履歴 | バージョン管理(git)と情報が重複しやすいため、git log で代替されることが多いです。 |
サンプルコード
シバン行とコメントの基本的な使い方を確認します。
backup.sh
#!/usr/bin/env bash
#
# backup.sh — 指定ディレクトリを tar.gz でバックアップするスクリプトです。
#
# 使い方:
# ./backup.sh <バックアップ元ディレクトリ> <バックアップ先ディレクトリ>
#
# 例:
# ./backup.sh /var/www/html /backup
#
set -euo pipefail # エラー発生時に即終了。未定義変数をエラーとして扱います。
# 引数チェック: 引数が2つなければ使い方を表示して終了します。
if [ "$#" -ne 2 ]; then
echo "使い方: $0 <バックアップ元> <バックアップ先>" >&2
exit 1
fi
SOURCE_DIR="$1" # バックアップ元ディレクトリ
DEST_DIR="$2" # バックアップ先ディレクトリ
# バックアップ元ディレクトリが存在するか確認します。
if [ ! -d "$SOURCE_DIR" ]; then
echo "エラー: '$SOURCE_DIR' が見つかりません。" >&2
exit 1
fi
# 現在時刻をファイル名に含めます(例: backup_20260426_143000.tar.gz)。
TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
ARCHIVE_NAME="backup_${TIMESTAMP}.tar.gz"
ARCHIVE_PATH="${DEST_DIR}/${ARCHIVE_NAME}"
# バックアップ先ディレクトリが存在しなければ作成します。
mkdir -p "$DEST_DIR"
# tar で圧縮アーカイブを作成します。
# -c: 作成、-z: gzip 圧縮、-f: ファイル名指定
tar -czf "$ARCHIVE_PATH" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
echo "バックアップ完了: $ARCHIVE_PATH"
実行例
chmod +x backup.sh ./backup.sh /var/www/html /backup バックアップ完了: /backup/backup_20260426_143000.tar.gz
コメントアウトを活用したデバッグのパターンを確認します。
deploy.sh
#!/usr/bin/env bash # deploy.sh — アプリケーションをデプロイするスクリプトです。 set -euo pipefail DEPLOY_DIR="/var/www/app" GIT_BRANCH="main" # デプロイ前の状態を確認します(デバッグ用: 本番では削除)。 # echo "現在のディレクトリ: $(pwd)" # git status # git pull で最新のコードを取得します。 cd "$DEPLOY_DIR" git pull origin "$GIT_BRANCH" # 依存関係を更新します。 # pip install は仮想環境内で実行する前提です。 pip install -q -r requirements.txt # データベースのマイグレーションを実行します。 # TODO: マイグレーション失敗時のロールバック処理を追加する(issue #42)。 python manage.py migrate # アプリケーションを再起動します。 # systemctl restart は sudo 権限が必要です。 sudo systemctl restart myapp echo "デプロイ完了"
よくあるミス
シバン行をファイルの2行目以降に書く
シバン行はファイルの1行目にのみ有効です。2行目以降に書いてもシェルを指定する機能は働きません(通常のコメントとして扱われます)。ファイルをコメントや空行から始めるとシバン行が認識されなくなります。
# NG: コメントが先にあるとシバン行が認識されない # このスクリプトはバックアップ用です。 #!/usr/bin/env bash # ← 2行目以降は無効 echo "hello"
修正後は次の通りです。
# OK: シバン行は必ず1行目に書く #!/usr/bin/env bash # このスクリプトはバックアップ用です。 echo "hello"
URL の # をコメントと誤解する
シェルスクリプトで URL を変数に代入するとき、URL に含まれる『#』(フラグメント識別子)がコメントとして解釈されます。クォートで囲んでいれば問題ありませんが、クォートがないと『#』以降が切り捨てられます。
# NG: URL の # 以降がコメントになる(クォートなし) URL=https://example.com/page#section # OK: クォートで囲む URL="https://example.com/page#section" echo "$URL" # https://example.com/page#section
概要
シェルスクリプト(bash/zsh/sh)で使えるコメント記法は『#』のみです。行頭から書く場合も、コードの行末に書く場合も同じ『#』を使います。複数行コメントの専用構文はなく、各行頭に『#』を付けるのが一般的です。
ファイルの1行目に書く『#!/usr/bin/env bash』はシバン行と呼ばれます。コメントと同じ記法ですが、OS(カーネル)がスクリプトを実行するシェルを選択するために読み取る特別な行です。シバン行は必ずファイルの1行目に書く必要があり、コメントや空行が先にあると認識されません。
スクリプトの先頭には目的・引数・使用例をコメントで書いておくと、後から読む人が使い方をすぐに把握できます。また、コマンドのオプション選択理由や複雑なパイプラインの意図を残しておくことで、将来の変更や保守が容易になります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。