今回は、RHEL(Red Hat Enterprise Linux)をはじめとするLinux環境で使用できる「ヒアドキュメント(Here Document)」について解説します。
<<EOFという記述を見たことはあるけれど、意味がよくわからない、使い方がいまいちピンとこないという方も多いのではないでしょうか。
本記事では、ヒアドキュメントの基本概念から実務で役立つ活用例まで、初心者の方にもわかりやすく段階的に説明していきます。
ヒアドキュメントとは?
ヒアドキュメント(Here Document)とは、シェルスクリプトやコマンドラインにおいて、複数行のテキストをまとめて入力するための仕組みです。「Here Document」を直訳すると「ここにある文書」となり、コマンドの「ここに」記述されたテキストブロックをそのまま入力として渡すことができます。
通常、コマンドに複数行の入力を渡す場合、echoコマンドを何度も実行したり、パイプで繋いだりする必要があります。しかし、ヒアドキュメントを使えば、複数行のテキストを見やすく、直感的に記述することが可能になります。
ヒアドキュメントのメリット
ヒアドキュメントを使用する主なメリットは以下の通りです。
- 可読性の向上:複数行のテキストをそのままの形式で記述できるため、コードが読みやすくなる
- 保守性の向上:設定ファイルの内容などを直感的に把握でき、修正が容易になる
- 効率的な記述:
echoコマンドを繰り返し書く必要がなく、コード量を削減できる - 特殊文字の扱いが簡単:クォートで囲む必要がある場面でも、比較的シンプルに記述できる
ヒアドキュメントの基本構文
ヒアドキュメントの基本的な構文は以下の通りです。
コマンド <<区切り文字
テキスト1行目
テキスト2行目
テキスト3行目
区切り文字
構文のポイント
<<(リダイレクト演算子):ヒアドキュメントの開始を示します- 区切り文字(デリミタ):テキストブロックの開始と終了を示す目印です。
EOFがよく使われますが、任意の文字列を指定できます - テキストブロック:コマンドに渡したい複数行のテキストを記述します
- 終了の区切り文字:開始時と同じ文字列を記述してテキストブロックを終了します
なぜ「EOF」が使われるのか?
EOFは「End Of File(ファイルの終わり)」の略称です。慣例的によく使用されますが、実際にはEND、TEXT、MARKERなど、任意の文字列を区切り文字として使用できます。ただし、チーム開発や実務ではEOFを使用するのが一般的であり、コードの可読性を保つためにもEOFの使用をおすすめします。
基本的な使用例
例1:catコマンドとの組み合わせ
最も基本的な使い方として、catコマンドと組み合わせて複数行のテキストを出力する例を見てみましょう。
cat <<EOF
こんにちは
これはヒアドキュメントのテストです
複数行のテキストを簡単に出力できます
EOF
実行結果:
こんにちは
これはヒアドキュメントのテストです
複数行のテキストを簡単に出力できます
例2:ファイルへの書き出し
リダイレクトと組み合わせることで、複数行のテキストをファイルに書き出すことができます。
cat <<EOF > /tmp/sample.txt
1行目のテキスト
2行目のテキスト
3行目のテキスト
EOF
このコマンドを実行すると、/tmp/sample.txtに3行のテキストが書き込まれます。
例3:ファイルへの追記
既存ファイルに追記する場合は、>>を使用します。
cat <<EOF >> /tmp/sample.txt
追記する1行目
追記する2行目
EOF
変数展開とクォートの違い【重要】
ヒアドキュメントを使う上で、最も重要かつ初心者がつまずきやすいポイントが変数展開の挙動です。区切り文字の記述方法によって、変数が展開されるかどうかが変わります。
変数が展開される場合(デフォルト)
区切り文字をそのまま記述した場合、ヒアドキュメント内の変数は展開されます。
NAME="山田太郎"
cat <<EOF
ユーザー名: $NAME
ホームディレクトリ: $HOME
現在のシェル: $SHELL
EOF
実行結果:
ユーザー名: 山田太郎
ホームディレクトリ: /home/user
現在のシェル: /bin/bash
変数を展開しない場合(クォートで囲む)
区切り文字をシングルクォート('EOF')またはダブルクォート("EOF")で囲むと、変数は展開されず、そのままの文字列として出力されます。
NAME="山田太郎"
cat <<'EOF'
ユーザー名: $NAME
ホームディレクトリ: $HOME
現在のシェル: $SHELL
EOF
実行結果:
ユーザー名: $NAME
ホームディレクトリ: $HOME
現在のシェル: $SHELL
使い分けのポイント
| 記述方法 | 変数展開 | 主な用途 |
|---|---|---|
<<EOF |
される | 動的に値を埋め込みたい場合 |
<<'EOF' |
されない | スクリプトや設定ファイルをそのまま出力したい場合 |
実務での活用例
活用例1:設定ファイルの自動生成
サーバーの初期構築時やプロビジョニングスクリプトで、設定ファイルを自動生成する場面で非常に便利です。
Apache(httpd)の設定ファイルを生成する例:
#!/bin/bash
DOMAIN="example.com"
DOC_ROOT="/var/www/html"
cat <<EOF > /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
ServerName $DOMAIN
DocumentRoot $DOC_ROOT
<Directory $DOC_ROOT>
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/${DOMAIN}_error.log
CustomLog /var/log/httpd/${DOMAIN}_access.log combined
</VirtualHost>
EOF
echo "設定ファイルを生成しました"
このスクリプトでは、変数$DOMAINと$DOC_ROOTの値が展開され、動的に設定ファイルが生成されます。
活用例2:シェルスクリプトの自動生成
別のシェルスクリプトを動的に生成する場合、変数展開を抑制するためにクォート付きのヒアドキュメントを使用します。
cat <<'EOF' > /usr/local/bin/backup.sh
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
tar -czf ${BACKUP_DIR}/backup_${DATE}.tar.gz /var/www/html
if [ $? -eq 0 ]; then
echo "バックアップが完了しました"
else
echo "バックアップに失敗しました"
fi
EOF
chmod +x /usr/local/bin/backup.sh
<<'EOF'を使用しているため、$BACKUP_DIRや$(date +%Y%m%d)などの変数・コマンド置換は展開されず、そのままスクリプトファイルに書き込まれます。
活用例3:複数行メッセージの出力
ユーザーへの案内メッセージやヘルプテキストを表示する際にも活用できます。
cat <<EOF
======================================
サーバーセットアップスクリプト
======================================
このスクリプトは以下の処理を実行します:
1. パッケージのアップデート
2. 必要なソフトウェアのインストール
3. ファイアウォールの設定
4. サービスの起動
続行しますか? (y/n)
EOF
初心者がつまずきやすいポイント
ポイント1:終了区切り文字の前にスペースを入れない
終了の区切り文字(EOF)の前にスペースやタブがあると、正しく認識されずエラーになります。
NGな例:
cat <<EOF
テキスト
EOF ← 前にスペースがあるためエラー
OKな例:
cat <<EOF
テキスト
EOF
ポイント2:区切り文字の大文字・小文字は区別される
開始と終了の区切り文字は完全に一致している必要があります。
NGな例:
cat <<EOF
テキスト
eof ← 大文字小文字が異なるためエラー
ポイント3:インデントを維持したい場合は <<- を使用
<<-を使用すると、行頭のタブ文字のみが無視されます(スペースは無視されません)。
cat <<-EOF
タブでインデントされたテキスト
この行もタブインデント
EOF
まとめ
本記事では、RHELにおけるヒアドキュメント(<<EOF)について、基本概念から実務での活用例まで解説しました。
ポイントの振り返り:
- ヒアドキュメントは複数行のテキストをまとめて入力するための仕組み
<<EOFで変数展開あり、<<'EOF'で変数展開なし- 設定ファイルの自動生成やスクリプト作成で活躍する
- 終了区切り文字の前にはスペースを入れない
ヒアドキュメントを使いこなすことで、シェルスクリプトの可読性と保守性が大きく向上します。ぜひ実務で活用してみてください。
※本記事はRHEL 8/9環境を想定していますが、他のLinuxディストリビューション(CentOS、Ubuntu、Debianなど)でも同様に使用できます。

コメント