ヒアドキュメント(«EOF)

ヒアドキュメントは複数行のテキストをコマンドの標準入力として渡す構文。 <<終端文字列で始まり、同じ終端文字列だけの行で終わる。

cat <<EOF
Hello, World!
EOF
Hello, World!

終端文字列は慣例的にEOFが使われるが、任意の文字列を指定できる。

変数展開とコマンド置換

デフォルトでは変数展開とコマンド置換が有効になる。

name=Alice
cat <<EOF
こんにちは、${name}!
今日の日付: $(date +%Y-%m-%d)
EOF
こんにちは、Alice!
今日の日付: 2026-06-13

クォートで展開を抑制する(«‘EOF’)

終端文字列をシングルクォートで囲むと、変数展開とコマンド置換が抑制される。

name=Alice
cat <<'EOF'
変数 ${name} は展開されない
コマンド置換 $(date) も実行されない
EOF
変数 ${name} は展開されない
コマンド置換 $(date) も実行されない

シェルスクリプトの内容をそのままファイルに書き出したい場合などに使う。

タブインデントを除去する(«-EOF)

<<-を使うと、本文および終端文字列の先頭にあるタブ文字を除去して出力できる。 関数やifの中に書いたヒアドキュメントのインデントを揃えるのに便利。

generate_config() {
	cat <<-EOF
	host=db.example.com
	port=5432
	EOF
}
generate_config
host=db.example.com
port=5432

除去できるのはタブ文字のみで、スペースは除去されない。 終端文字列の前もタブで揃える必要がある。

ファイルに書き出す

リダイレクトと組み合わせてファイルに書き出せる。

DB_HOST=db.example.com
DB_NAME=myapp
cat <<EOF > /etc/app/database.conf
host=${DB_HOST}
name=${DB_NAME}
port=5432
EOF

sudoが必要なファイルへの書き出しはsudoでリダイレクトを使う方法 を参照。

ヒアストリング(«<)

ヒアストリングは1行の文字列を標準入力として渡す構文。 echo | コマンドのパイプと同じことをより短く書ける。

grep "World" <<< "Hello, World!"
Hello, World!

wcでワード数を数える例。

wc -w <<< "one two three"
3