【RHEL】ヒアドキュメント(<<EOF)とは?基本から実務活用まで徹底解説

ITナレッジ

今回は、RHEL(Red Hat Enterprise Linux)をはじめとするLinux環境で使用できる「ヒアドキュメント(Here Document)」について解説します。

<<EOFという記述を見たことはあるけれど、意味がよくわからない、使い方がいまいちピンとこないという方も多いのではないでしょうか。

本記事では、ヒアドキュメントの基本概念から実務で役立つ活用例まで、初心者の方にもわかりやすく段階的に説明していきます。


ヒアドキュメントとは?

ヒアドキュメント(Here Document)とは、シェルスクリプトやコマンドラインにおいて、複数行のテキストをまとめて入力するための仕組みです。「Here Document」を直訳すると「ここにある文書」となり、コマンドの「ここに」記述されたテキストブロックをそのまま入力として渡すことができます。

通常、コマンドに複数行の入力を渡す場合、echoコマンドを何度も実行したり、パイプで繋いだりする必要があります。しかし、ヒアドキュメントを使えば、複数行のテキストを見やすく、直感的に記述することが可能になります。

ヒアドキュメントのメリット

ヒアドキュメントを使用する主なメリットは以下の通りです。

  • 可読性の向上:複数行のテキストをそのままの形式で記述できるため、コードが読みやすくなる
  • 保守性の向上:設定ファイルの内容などを直感的に把握でき、修正が容易になる
  • 効率的な記述echoコマンドを繰り返し書く必要がなく、コード量を削減できる
  • 特殊文字の扱いが簡単:クォートで囲む必要がある場面でも、比較的シンプルに記述できる

ヒアドキュメントの基本構文

ヒアドキュメントの基本的な構文は以下の通りです。

コマンド <<区切り文字
テキスト1行目
テキスト2行目
テキスト3行目
区切り文字

構文のポイント

  1. <<(リダイレクト演算子):ヒアドキュメントの開始を示します
  2. 区切り文字(デリミタ):テキストブロックの開始と終了を示す目印です。EOFがよく使われますが、任意の文字列を指定できます
  3. テキストブロック:コマンドに渡したい複数行のテキストを記述します
  4. 終了の区切り文字:開始時と同じ文字列を記述してテキストブロックを終了します

なぜ「EOF」が使われるのか?

EOFは「End Of File(ファイルの終わり)」の略称です。慣例的によく使用されますが、実際にはENDTEXTMARKERなど、任意の文字列を区切り文字として使用できます。ただし、チーム開発や実務では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など)でも同様に使用できます。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

ITナレッジRHEL
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました