言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. シェルスクリプト辞典
  3. コメント(#)

コメント(#)

シェルスクリプトにおけるコメントの書き方と使い方です。『#』で始まる一行コメントの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 などの静的解析ツールもこのスタイルを前提にしています。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。