シェルスクリプトではコードの意図や処理内容を明確にするために コメントアウト を使います。 コメントは単なるメモではなく、保守性や品質を高めるための重要な技術です。
この記事では、基本となる1行コメント(#)から、実務やデバッグで頻出する複数行をまとめてコメントアウトする実践テクニック(ヒアドキュメントの活用)、読みやすいヘッダーコメントの設計まで分かりやすく解説します。
※本連載はロードマップ形式で順次公開しています。連載全体の流れや各回の一覧は「シェルスクリプト入門連載ロードマップ」からも確認できます。
シェルスクリプトのコメントアウト早見表
まずは「今すぐ書き方を確認したい」という方に向けて、代表的な書き方を表に整理しました。
| 用途 | 書き方 | 主な利用シーン・特徴 |
|---|---|---|
| 1行コメント | # コメント | 処理の説明、行末へのインライン記述 |
| 複数行コメント(推奨) | : << 'EOF' | 複数行の一括無効化、デバッグ時の一時停止 |
| 条件分岐による無効化 | if false; then | デバッグ時にブロックごとスキップする代替記法 |
| エディタショートカット | Ctrl + /(Win)Cmd + /(Mac) | 複数行を選択して一括で # を付け外し |
コメントアウトとは?
シェルスクリプトでは # を付けるとその行はコメントになり、シェルが無視します。
# これはコメントです
echo "Hello"VSCodeではショートカットが用意されており、「Ctrl + /(Windows)、 」で簡単にコメントアウトできます。Cmd + /(Mac)
コマンドを直接説明する場合は、そのコマンドの後ろに書くこともあります。
この場合、#より後ろはコメントと見做されます。
echo "$LINENO" # 行番号を表示コメントの役割として、
- 意図の共有:なぜこの処理が必要なのか
- 保守性向上:後から自分や他人がコードを読みやすくなる
- 事故防止:重大な影響を与える処理に注意書きを残せる
などが挙げられます。
複数行をまとめてコメントアウトする方法
C言語の /* ... */ やPythonの """ ... """ のような「複数行コメント専用の構文」は、シェルスクリプトには標準で用意されていません。
しかし、実務やデバッグではまとまった処理を一時的に無効化したい場面がよくあります。その場合は以下の手法を活用するのが一般的です。
方法1:nullコマンド(:)とヒアドキュメントを活用する(推奨)
シェルスクリプトで最も広く使われている複数行コメントの手法が、何もしない組み込みコマンド :(コロン) と ヒアドキュメント(<<) を組み合わせる方法です。
: << 'EOF'
echo "このブロックの処理は実行されません"
cp -r /var/data /backup/data
rm -rf /tmp/work
EOFコロン(:)は何もしないコマンド(常に終了ステータス0を返すコマンド)です。ヒアドキュメントによって入力された複数行の文字列を、何もしないコマンドに渡すことで、結果として「中身を実行させずにスキップする」という動作を実現します。
【重要】安全対策:終端文字列はシングルクォーテーションで囲む
この手法を使う際に気をつけたい重要な注意点があります。ヒアドキュメントの区切り文字('EOF')をクォーテーションで囲まない場合、コメントアウトしたつもりでも内部の変数展開($VAR)やコマンド置換($(date) やバッククォート)がシェルによって評価・実行されてしまうリスクがあります。
# ❌ 注意が必要な例(クォートなし:内部のコマンド置換が実行されてしまう)
: << EOF
echo "削除処理を実行"
$(rm -f /tmp/test.txt) # コメント内でも実行されてしまう!
EOF
# ✔ 推奨される安全な例(シングルクォートで囲む:中身が展開されずに文字列として解釈される)
: << 'EOF'
echo "削除処理を実行"
$(rm -f /tmp/test.txt) # 安全に無効化される
EOF意図しない副作用やエラーを防ぐためにも、: << 'EOF' のようにシングルクォートで囲む記法を推奨します。
方法2:if false による条件無効化
条件分岐を用いて、決して実行されないブロックを作成する方法です。
if false; then
echo "この処理は実行されません"
systemctl restart nginx
fiこの記法は「一時的に処理をスキップし、後で条件を戻して再テストしたい」というデバッグ用途で役立ちます。ただし、ブロック内のコード自体はシェルによる構文チェック(シンタックス解析)が行われるため、構文エラーが含まれているとスクリプト全体が停止する点に注意してください。
方法3:エディタの矩形選択・ショートカットによる一括コメント
エディタの機能を使い、選択した複数行の先頭に # を一括で挿入する方法です。
VSCodeや各種エディタでは、範囲選択した状態で Ctrl + /(Macは Cmd + /)を押すだけで簡単に複数行のコメント化・解除を切り替えられます。
ヘッダーを追加する
シェルスクリプトの1行目にはshebangを記載しますが、次に ヘッダーコメント を書くのが一般的です。 目的は「このスクリプトが何をするものか」を自分だけではなく、チームメンバーと共有するためです。
ヘッダーの基本は5W(When / Who / What / Why / Where)で、以下のように記載します。
#!/usr/bin/env bash
# ============================================
# 担当者 : 山田太郎
# スクリプト名 : PostgreSQL のバックアップ取得
# 目的 : 手動作業のミス防止と定期バックアップの自動化
# 対象 : /var/lib/postgresql/data
# 作成日 : 2026-01-28 Ver.1 新規作成
# 更新履歴 : 2026-03-10 Ver.2 〇〇処理を追加
# : 2026-04-15 Ver.3 〇〇処理を〇〇に変更
# ============================================経験的に更新履歴は下に伸びていくので、ヘッダーの最後に記載してあることが多いです。
特に「目的や概要」にWhy(なぜ)が書いてあると品質が一段上がります。
処理ごとのコメントの書き方
スクリプト内の各処理にもコメントを付けます。
ポイントは 「処理をそのまま記述する」のではなく「なぜ必要か」を書くことです。
❌ 悪い例(コードをそのまま説明している)
# dataディレクトリをtarで圧縮
tar -czf backup.tar.gz /var/lib/postgresql/data✔ 良い例(コードの意図が分かる)
# PostgreSQL停止後、復旧用としてデータディレクトリ全体をバックアップ
tar -czf backup.tar.gz /var/lib/postgresql/data処理が多い場合は、ブロック単位でコメントを書くと読みやすくなります。
# --------------------------------------------
# Step1: 古いバックアップを削除(保持期間は7日)
# --------------------------------------------
find /backup -mtime +7 -delete変数や定数の意味を明確にする場合も有効です。
# バックアップ保持日数
RETENTION_DAYS=7詳細なタスク管理は Git(Issue / Pull Request)等で行うのが実務的ですが、TODO / FIXME等のアノテーションコメントも併用できます。
# TODO: エラー時のリトライ処理を追加する
# FIXME: 一時ディレクトリのパスを環境変数化するVSCodeの拡張機能Todo Treeを使うと、アノテーションコメントを一覧で確認できて便利です。

なお、実施済みのTODOや修正済みのFIXMEはコードが汚れるため、最終的に削除しましょう。
まとめと連載のご案内
今回は、シェルスクリプトにおけるコメントアウトの基本から複数行の無効化テクニックまでを解説しました。
- 1行コメントは
#を使用し、処理の意図(Why)を残す。 - 複数行を一時的に無効化したい場合は、
: << 'EOF'のように終端文字をシングルクォートで囲んで安全に行う。 - チーム開発では5Wを意識したヘッダーコメントを残すことで、引き継ぎや保守が格段にスムーズになる。
コメントを適切に使いこなすことで、トラブル時の調査や将来の機能拡張がとても容易になります。
現場で使えるシェルスクリプト入門 連載ナビゲーション
- ◀ 前回:入門1:shebang(シバン)の役割と正しい書き方
- ▶ 次回:入門3:定数の宣言と使い分け
- 📁 シリーズ全体:シェルスクリプト入門連載ロードマップ

コメント