コメント(#)
シェルスクリプトにおけるコメントの書き方と使い方です。『#』で始まる一行コメントの1種類のみです。ファイル先頭に書くシバン行(『#!/bin/bash』など)も『#』で始まりますが、カーネルがインタープリターを特定するための特殊な行です。コメントはプログラムの動作に影響しませんが、スクリプトの意図や前提条件を記録するために使います。
構文
#!/bin/bash # シバン行(shebang): ファイルの1行目に書くインタープリター指定です。 # カーネルがこの行を読み取り、指定したシェルでスクリプトを実行します。 # 一行コメントです。# 以降、行末までがコメントになります。 count=10 # 行末コメントです。コードの右側に短い補足を添えます。
コメントの種類
| 種類 | 書き方 | 概要 |
|---|---|---|
| 一行コメント | # テキスト | 『#』以降、行末までがコメントになります。行頭・行末どちらに置いても使えます。 |
| シバン行 | #!/path/to/interpreter | ファイルの1行目にだけ書くインタープリター指定です。コメントの一種ですが、カーネルが特別に扱います。 |
シェルスクリプトにはブロックコメントの専用構文がありません。複数行をコメントにするときは、各行に『#』を付けます。
コメントを書くべき場所・書かなくてよい場所
| 判断 | 場面 | 理由 |
|---|---|---|
| 書くべき | 「なぜこう実装したか」の理由 | コードを読むだけではわからない設計意図やトレードオフを残しておくと、将来の自分や他の開発者が助かります。 |
| 書くべき | 複雑なアルゴリズムや計算式 | 何をしているか一見でわかりにくい処理には、動作の概要を補足します。 |
| 書くべき | スクリプトの冒頭 | スクリプトの目的・使い方・引数・必要な権限・依存コマンドを冒頭にまとめると、読む前に概要を把握できます。 |
| 書くべき | デバッグ中の一時的な無効化 | コメントアウトした理由や期限を残しておくと、後で削除し忘れるリスクが減ります。 |
| 書かなくてよい | コードを読めば明らかな処理 | 『# iに1を加算する』のような自明な説明はノイズになります。変数名・関数名をわかりやすくすれば不要になります。 |
| 書かなくてよい | 変更履歴・削除したコード | バージョン管理(git)があるため、コメントに古いコードや変更日を残す必要はありません。 |
サンプルコード
スクリプト冒頭のコメントブロックと、一行コメントの基本的な使い方です。
comment_basic.sh
#!/bin/bash # # backup_logs.sh — ログファイルを指定ディレクトリへバックアップするスクリプトです。 # # 使い方: # ./backup_logs.sh <ソースディレクトリ> <バックアップ先ディレクトリ> # # 例: # ./backup_logs.sh /var/log /backup/logs # # 必要な権限: ソースディレクトリの読み取り権限、バックアップ先の書き込み権限 SOURCE_DIR="$1" # バックアップ元のディレクトリパス DEST_DIR="$2" # バックアップ先のディレクトリパス TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # ファイル名に付ける日時スタンプ # 引数が2つ指定されているか確認します。 if [ "$#" -ne 2 ]; then echo "Usage: $0" >&2 exit 1 fi # バックアップ先ディレクトリが存在しなければ作成します。 if [ ! -d "$DEST_DIR" ]; then mkdir -p "$DEST_DIR" fi ARCHIVE_NAME="${DEST_DIR}/logs_${TIMESTAMP}.tar.gz" # tar でアーカイブを作成します。 # -z: gzip 圧縮、-c: 作成、-f: ファイル名指定 tar -zcf "$ARCHIVE_NAME" -C "$SOURCE_DIR" . echo "Backup saved: $ARCHIVE_NAME"
$ ./backup_logs.sh /var/log /backup/logs Backup saved: /backup/logs/logs_20240801_120000.tar.gz
コメントアウトを使ってデバッグ出力を管理する例です。
comment_debug.sh
#!/bin/bash
# ファイル一覧を処理するスクリプトです。
# デバッグ中はコメントアウトを使って中間値を確認します。
TARGET_DIR="${1:-.}" # 第1引数がなければカレントディレクトリを対象にします
count=0
total_size=0
for file in "$TARGET_DIR"/*; do
[ -f "$file" ] || continue # 通常ファイル以外はスキップします
size=$(wc -c < "$file")
# デバッグ中: ファイルごとのサイズを確認します(確認後に削除)
# echo "DEBUG: file=$file size=$size"
count=$((count + 1))
total_size=$((total_size + size))
done
# TODO: 大きなファイル(1MB超)だけを別途リストアップする処理を追加する
echo "Files: $count"
echo "Total size: ${total_size} bytes"
$ ./comment_debug.sh /etc Files: 42 Total size: 102400 bytes
概要
シェルスクリプトのコメントは『#』による一行コメントの1種類だけです。ブロックコメントの専用構文はなく、複数行をコメントにするときは各行に『#』を付けます。
ファイル先頭のシバン行(『#!/bin/bash』など)も『#』で始まりますが、これはカーネルが読み取るインタープリター指定であり、通常のコメントとは役割が異なります。シバン行はファイルの1行目にだけ書く必要があります。2行目以降に書いてもカーネルに認識されず、単なるコメントとして扱われます。
スクリプト冒頭に目的・使い方・引数・依存コマンドをまとめたコメントブロックを置く慣習が広く使われています。コメントは「何をしているか」ではなく「なぜそうしているか」を書くと有用性が高まります。削除したコードや変更履歴をコメントとして残す必要はなく、それらはバージョン管理(git)で追跡できます。
よくあるミス
シバン行を1行目以外に書いて実行できない
シバン行(『#!/bin/bash』など)はファイルの1行目に書く必要があります。カーネルがスクリプトを実行する際にファイルの先頭2バイト(『#!』)を確認してインタープリターを決定するため、2行目以降に書いても無視されます。
shebang_ng.sh
# このスクリプトはバックアップを行います #!/bin/bash # 2行目のシバン行はカーネルに認識されない echo "backup start"
chmod +x shebang_ng.sh ./shebang_ng.sh ./shebang_ng.sh: line 1: このスクリプトはバックアップを行います: command not found
修正後:
shebang_ok.sh
#!/bin/bash # このスクリプトはバックアップを行います echo "backup start"
chmod +x shebang_ok.sh ./shebang_ok.sh backup start
『#』の直後にスペースを入れない
『#テキスト』のようにスペースなしで書いても動作しますが、多くのコーディング規約では『# テキスト』のようにスペースを1つ入れる書き方が推奨されています。ShellCheck などの静的解析ツールもこのスタイルを前提にしています。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。