カテゴリ: Linux 更新日: 2026/05/27

Linuxヒアドキュメントを完全解説!複数行入力をシェルスクリプトで扱う基本

Linuxのヒアドキュメントとは?複数行入力を扱う方法
Linuxのヒアドキュメントとは?複数行入力を扱う方法

先生と生徒の会話形式で理解しよう

生徒

「シェルスクリプトで、長い文章や設定ファイルのメッセージをまとめて書き込みたいときはどうすればいいですか?」

先生

「それなら、Here Document(ヒアドキュメント)という機能がぴったりですよ。複数行のテキストをひとまとめにしてコマンドに渡せるんです。」

生徒

「一気に書けるのは便利そうですね!でも、記述方法が難しそうなイメージがあります。」

先生

「仕組みさえ分かれば実はとてもシンプルです。Bash(バッシュ)やZsh(ゼットシェル)でも共通して使える技術なので、基礎からじっくり見ていきましょう。」

Linuxを初めて学ぶ人や、 OS・プロセス・メモリ管理・仮想マシン・コンテナの仕組みを図解で理解したい人におすすめの定番書籍です。

試して理解 Linuxのしくみを見る

※ Amazonアソシエイト広告リンク

1. ヒアドキュメントとは?

1. ヒアドキュメントとは?
1. ヒアドキュメントとは?

Linux(リナックス)におけるHere Document(ヒアドキュメント)とは、シェルスクリプトやコマンドラインにおいて、複数行にわたる文字列を特定のコマンドに直接流し込むための仕組みです。通常、コマンドに文字を渡すときは引数を使いますが、文章が長くなると管理が大変になります。そこで「ここから(Here)ドキュメントが始まりますよ」という合図を送るのがこの機能の役割です。

読み方は、Here Document(ヒアドキュメント)といいます。主にBash(バッシュ)などのShell(シェル)環境で使用され、自動化ツールや設定ファイルの作成には欠かせない知識です。標準入力(ヒョウジュンニュウリョク)を介してデータを渡すため、非常に柔軟な処理が可能になります。

2. ヒアドキュメントの基本構文と使い方

2. ヒアドキュメントの基本構文と使い方
2. ヒアドキュメントの基本構文と使い方

ヒアドキュメントを使うには、<<という記号と、入力の終わりを示すEOF(イーオーエフ)などの識別子(シキベツシ)を使用します。EOFは「End Of File」の略称ですが、名前は何でも構いません。一般的には「EOS(End Of String)」なども使われますが、慣習としてEOFが最も多用されます。

基本的な書き方は以下の通りです。コマンドの後に記号と識別子を書き、その次の行から内容を記述し、最後にまた識別子を置くことで入力を終了します。これにより、catコマンドなどでメッセージを表示したり、ファイルへ保存したりすることが容易になります。


cat << EOF
こんにちは。
これはヒアドキュメントのテストです。
複数行を一度に表示できます。
EOF
こんにちは。
これはヒアドキュメントのテストです。
複数行を一度に表示できます。

3. ファイルへの書き出しを効率化する方法

3. ファイルへの書き出しを効率化する方法
3. ファイルへの書き出しを効率化する方法

ヒアドキュメントの真骨頂は、ファイル作成の自動化にあります。リダイレクト(出力の切り替え)と組み合わせることで、スクリプトの中から動的に設定ファイルやログファイルを生成できます。例えば、Webサーバーの設定やユーザーへの通知文などを一括で作成する場合に多用されます。

通常、1行ずつechoコマンドを使って書き込むのは非効率ですが、ヒアドキュメントを使えば、見たままの形式でファイルに保存できるため、ミスが減り可読性(カドクセイ)も向上します。初心者がスクリプトを書く際に、まず覚えておきたい便利なテクニックの一つです。


cat << EOF > sample.txt
ファイル名: sample.txt
作成者: Linuxユーザー
目的: 複数行入力の練習
EOF
cat sample.txt
ファイル名: sample.txt
作成者: Linuxユーザー
目的: 複数行入力の練習

4. 変数展開を利用した動的なメッセージ作成

4. 変数展開を利用した動的なメッセージ作成
4. 変数展開を利用した動的なメッセージ作成

ヒアドキュメント内では、シェル変数(シェルヘンスウ)を展開して利用することができます。これにより、実行時の状況に合わせて中身を書き換えるメッセージの作成が可能になります。例えば、実行した日付や、スクリプト内で定義したユーザー名などを文章に埋め込むことができます。

ただし、識別子を引用符(クォーテーション)で囲んでしまうと、変数が展開されずにそのままの文字として扱われるため注意が必要です。動的に内容を変えたい場合は、そのままEOFと記述し、変数をそのまま表示したい場合は'EOF'のように記述するという使い分けが重要になります。


USER_NAME="Tanaka"
cat << EOF
こんにちは、${USER_NAME}さん。
本日の日付は $(date "+%Y-%m-%d") です。
システムへようこそ。
EOF
こんにちは、Tanakaさん。
本日の日付は 2026-04-02 です。
システムへようこそ。

5. インデントをきれいに保つハイフンの活用

5. インデントをきれいに保つハイフンの活用
5. インデントをきれいに保つハイフンの活用

シェルスクリプト内でif文やループの中にヒアドキュメントを書くと、コードの見た目を整えるためにインデント(字下げ)を入れたくなります。しかし、通常のヒアドキュメントでは、行頭のスペースもそのまま文字として認識されてしまいます。これを解決するのが<<-(ハイフン付きの記号)です。

このハイフンを使うと、行頭にあるタブ文字を無視して処理してくれます。スペースではなくタブである必要がありますが、これを使うことでスクリプトの構造を美しく保ちつつ、出力結果には不要な余白を含めないというスマートなコーディングが可能になります。プログラミングにおいて、可読性は保守性(ホシュセイ)を高める重要な要素です。


if true; then
    cat <<- EOF
    この行の前にあるタブは無視されます。
    スクリプトが見やすくなりますね。
    EOF
fi
この行の前にあるタブは無視されます。
スクリプトが見やすくなりますね。

6. 特殊文字のエスケープと無効化

6. 特殊文字のエスケープと無効化
6. 特殊文字のエスケープと無効化

ヒアドキュメント内で、ドル記号($)やバッククォート(`)などの特殊な意味を持つ記号を、そのまま文字として扱いたい場合があります。これをエスケープ(回避)処理と呼びます。一つ一つの記号の前にバックスラッシュを付ける方法もありますが、文章全体で変数の展開を止める方法がより簡単です。

開始の識別子をシングルクォーテーションやダブルクォーテーションで囲む(例:<< 'EOF')ことで、ヒアドキュメント内のすべての特殊文字が無効化され、純粋なテキストとして扱われます。設定ファイルの雛形(ヒナガタ)を作る際など、変数として解釈されたくない記号が多数含まれる場合に非常に重宝します。

7. パイプラインと組み合わせた高度な操作

7. パイプラインと組み合わせた高度な操作
7. パイプラインと組み合わせた高度な操作

ヒアドキュメントの結果を、そのまま別のコマンドに渡すことも可能です。これをPipe(パイプ)処理と呼びます。例えば、ヒアドキュメントで作成した文章を、そのままgrepコマンドで検索したり、sedコマンドで文字を置換したりすることができます。一度ファイルに保存する手間が省けるため、処理速度の向上に繋がります。

また、スクリプト内でデータベースを操作する際、SQLクエリ(エスキューエルクエリ)をヒアドキュメントで記述し、そのままデータベース接続コマンドへ流し込むという手法もよく使われます。これにより、複雑な命令もスクリプト内で直感的に記述できるようになります。

8. 管理者権限でのファイル書き込み

8. 管理者権限でのファイル書き込み
8. 管理者権限でのファイル書き込み

システムに関わる重要な設定ファイルを変更する場合、Root(ルート)権限が必要になります。しかし、単純にsudo cat << EOF > /etc/configと実行しても、リダイレクト部分は実行ユーザーの権限で処理されるため、権限エラーになることがあります。このようなときは、teeコマンドと組み合わせるのがLinuxの定番の解決策です。

teeコマンドは、標準入力から受け取った内容を画面に表示しつつ、ファイルにも保存するコマンドです。これにsudoを付加することで、管理者権限が必要なディレクトリに対しても安全にヒアドキュメントの内容を書き込むことができます。サーバー構築の現場では必須のテクニックです。


cat << EOF | sudo tee /etc/motd
Welcome to the Linux Server!
Authorized access only.
EOF
Welcome to the Linux Server!
Authorized access only.

9. ヒアドキュメントを使う際の注意点

9. ヒアドキュメントを使う際の注意点
9. ヒアドキュメントを使う際の注意点

便利なヒアドキュメントですが、いくつか注意点があります。まず、終了の識別子(EOFなど)の前後には、余計なスペースや文字を入れてはいけません。完全に一致する文字列だけで1行を構成する必要があります。もしスペースが入ってしまうと、シェルは「まだ入力が終わっていない」と判断し、エラーの原因となります。

また、非常に巨大なデータを扱う場合は、メモリの消費量にも配慮が必要です。数千行程度であれば問題ありませんが、数ギガバイトに及ぶようなデータをスクリプト内に直接埋め込むのは現実的ではありません。あくまで、設定ファイルや短いメッセージ、定型文の生成に適した機能であることを理解しておきましょう。

LPICレベル1の合格を目指している人や、 Linuxコマンド・シェル・ネットワーク・セキュリティの試験対策を効率よく進めたい人におすすめの定番問題集です。

Linux教科書 LPICレベル1 スピードマスター問題集を見る

※ Amazonアソシエイト広告リンク

まとめ

まとめ
まとめ

Linuxヒアドキュメント活用のポイントと重要キーワード

これまでに学んだLinux(リナックス)Here Document(ヒアドキュメント)は、シェルスクリプトの作成効率を劇的に向上させる強力な機能です。長いテキストや設定ファイルの内容を、一行ずつechoコマンドで出力する手間を省き、コードの可読性を高めることができます。特に、Standard Input(標準入力)を介してデータを渡す仕組みを理解することで、Bash(バッシュ)における自動化の幅が広がります。

重要なポイントを振り返ると、まずは基本の開始記号<<と、終了を示す識別子EOF(イーオーエフ)の使い方です。この識別子は任意ですが、一貫性を持たせることがチーム開発においても重要になります。また、Redirect(リダイレクト)を用いたファイル保存や、Pipe(パイプ)による別コマンドへの受け渡しは、実務レベルのサーバー構築や保守運用において非常に頻繁に使用されるテクニックです。

変数展開とエスケープ処理の使い分け

ヒアドキュメント内でShell Variable(シェル変数)を利用する場合、デフォルトでは変数が展開されます。しかし、プログラムのソースコードや設定ファイルの雛形を出力する際など、$記号をそのまま表示したい場合には、開始識別子をクォーテーションで囲む(例:'EOF')ことで、展開を無効化するEscape(エスケープ)処理が必要になります。この使い分けができるようになると、複雑なスクリプトも自由自在に制御できるようになります。

さらに、<<-を利用したIndent(インデント)の制御は、スクリプトを美しく保つための必須スキルです。行頭のタブを無視させることで、条件分岐(if文)やループ処理の中でも、コードの構造を崩さずにヒアドキュメントを記述できます。こうした細かな配慮が、後のメンテナンスのしやすさ、つまりMaintainability(保守性)に繋がります。

実践的な活用例:Java設定ファイルの自動生成

ヒアドキュメントは、プログラムの構成ファイルを作成するのにも適しています。例えば、Javaのアプリケーションを実行するための環境設定ファイルを、シェルスクリプトから動的に生成する例を見てみましょう。ここでは、これまでに学んだ変数展開とリダイレクトを組み合わせています。


#!/bin/bash

# アプリケーションの設定値を定義
APP_NAME="MyJavaApp"
DB_URL="jdbc:mysql://localhost:3306/mydb"
MAX_MEMORY="1024m"

# ヒアドキュメントで設定ファイルを生成
cat << EOF > application.properties
# ${APP_NAME} Configuration File
# Generated on $(date)
database.url=${DB_URL}
java.opts=-Xmx${MAX_MEMORY}
EOF

echo "設定ファイルの生成が完了しました。"

このように、シェルスクリプト内で定義した変数を設定ファイルに反映させることで、環境ごとに異なるパラメータを自動でセットすることが可能になります。Automation(自動化)の現場では、手動によるミスを防ぐためにこうした手法が推奨されています。

高度なTips:管理者権限とセキュリティ

最後に忘れてはならないのが、システムディレクトリへの書き込みにおける権限の問題です。sudo権限が必要なファイルに対しては、直接リダイレクトするのではなく、teeコマンドを組み合わせて処理するのが一般的です。これにより、セキュリティを確保しつつ、必要な設定変更を確実に実行できます。ヒアドキュメントは単なる文字列入力の手段ではなく、Linuxシステムを制御するための、非常に奥が深い、そして実用的なインターフェースなのです。

先生と生徒の振り返り会話

生徒

「先生、ヒアドキュメントについて詳しく教えていただきありがとうございました!最初は何だか難しそうだと思っていましたが、実際に書いてみると、複数のechoコマンドを使うよりずっとスッキリしますね。」

先生

「そうですね。特に行数が多いメッセージや、設定ファイルのテンプレートを扱うときには、この方法が一番視認性が高いんです。実際に使ってみて、どこが一番印象に残りましたか?」

生徒

「はい、変数の展開をコントロールできるのが面白いと思いました。EOFを引用符で囲むだけで、ドキュメント内のドル記号がそのまま文字として扱われるのは驚きました。これならプログラミングコードの雛形を作るのも簡単ですね!」

先生

「その通りです。シェルの変数を埋め込みたいときと、中身をそのまま維持したいときで、開始タグの書き方を変えるのがコツですよ。あと、インデントについても覚えていますか?」

生徒

「もちろんです!<<-を使えば、行頭のタブ文字を無視してくれるんですよね。これでif文の中にヒアドキュメントを書いても、コードが右側にズレていかなくて済みます。見た目が綺麗なコードは、バグも見つけやすそうです。」

先生

「素晴らしい理解度ですね!最後に、システム設定を変更するときは、リダイレクトではなくteeコマンドとsudoを組み合わせるのを忘れないでください。これであなたもLinuxの自動化マスターへの第一歩を踏み出しましたね。」

生徒

「はい!さっそく自分のスクリプトに取り入れて、色々な設定ファイルを自動で作れるように練習してみます。本当にありがとうございました!」

カテゴリの一覧へ
新着記事
New1
Linux
Linuxの/proc/meminfoとは?メモリ使用状況を確認する仕組みを初心者向けに徹底解説
新規投稿
New2
情報セキュリティマネジメント試験
RATとは?リモートアクセス型ウイルスの仕組みと対策を初心者向けに解説
更新記事
New3
基本情報技術者試験
ビッグデータとは?初心者でもわかる大量データ活用の基本と活用事例
更新記事
New4
基本情報技術者試験
クライアントとは?初心者でもわかるコンピュータの基本用語をやさしく解説
更新記事
人気記事
No.1
Java&Spring記事人気No1
基本情報技術者試験
NIC
308
NICとは何か?初心者にもわかるネットワークインターフェースカードの基本
No.2
Java&Spring記事人気No2
基本情報技術者試験
セグメントとは?ネットワークの基本単位を初心者向けにやさしく解説
No.3
Java&Spring記事人気No3
基本情報技術者試験
16進数とは?初心者にもわかる意味・読み方・変換方法をやさしく解説!
No.4
Java&Spring記事人気No4
基本情報技術者試験
DHCP
232
DHCPとは?初心者でもわかるIPアドレス自動割り当ての仕組み
No.5
Java&Spring記事人気No5
基本情報技術者試験
マイクロ(μ)とは?初心者にもわかる単位の意味と使い方をやさしく解説
No.6
Java&Spring記事人気No6
基本情報技術者試験
SMTP
174
SMTPとは?初心者でもわかるメール送信の仕組みとプロトコルをやさしく解説!
No.7
Java&Spring記事人気No7
基本情報技術者試験
IMAP
162
IMAPとは?初心者でもわかるメール受信プロトコルの仕組みと使い方
No.8
Java&Spring記事人気No8
基本情報技術者試験
DDL
155
データベースのDDLとは?初心者にもわかる定義と使い方をやさしく解説!