ヒアドキュメント(Here Document)
概要
ヒアドキュメントは、シェルスクリプトで複数行の文字列を扱うための機能。<<
演算子を使用して、指定した区切り文字まで標準入力として扱う。
私はDockerファイルやビルド検証でよく使う。他にも色々と使える場面があってすごく便利。特に検証でviを何度も編集する時に別の選択肢としてヒアドキュメント使えると便利。
メリット
-
複数行テキストを直接スクリプト内に記述可能
文字列連結や改行文字(\n)を使わずに、そのまま複数行を書ける -
エスケープ処理が不要
クォート(")やバックスラッシュ(\)などの特殊文字をエスケープしなくて済む -
可読性の向上
出力されるテキストの構造がスクリプト内で直感的に把握できる -
変数展開の制御が可能
クォートの有無で変数展開のオン・オフを簡単に切り替えられる
使用場面
-
設定ファイルの生成
nginx.conf
やdocker-compose.yml
などの設定ファイルを動的に作成 -
簡単な検証やテスト用のファイル生成
サンプルデータやテスト用の設定ファイルを一時的に作成 -
Dockerファイルやビルド検証
検証用のDockerfileを素早く作成してビルドテストを実行
viエディタとの使い分け
ヒアドキュメントを使う場面:
- スクリプト内で動的にファイルを生成したい
- 変数展開を含む内容を出力したい
- 一時的なファイルやテストデータを作成したい
viエディタを使う場面:
- 既存ファイルを編集したい
- 対話的に内容を確認しながら作業したい
- 複雑な編集作業が必要
# ヒアドキュメント:1つのコマンドで完結
cat << EOF > test.txt
テスト用ファイル
複数行対応
EOF
# viの場合:エディタを開く→編集→保存→終了の手順が必要
vi test.txt # エディタが開く
基本構文
1. 標準入力(基本的な出力)
cat << EOF
複数行のテキスト
変数展開: ${USER}
コマンド実行: $(date)
EOF
仕組み:
<< EOF
で開始、EOF
で終了(区切り文字は任意)- 区切り文字までの内容が標準入力として扱われる
- 変数やコマンドが自動的に展開される
2. ファイル作成
cat << EOF > output.txt
ファイルに出力
複数行対応
変数: ${HOME}
現在時刻: $(date)
EOF
実用例
ファイル作成
cat << EOF > config.ini
[database]
host=localhost
user=${DB_USER}
password=${DB_PASS}
EOF
Dockerファイル作成と検証
# Dockerfileを作成
cat << EOF > Dockerfile.test
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE ${PORT:-3000}
CMD ["npm", "start"]
EOF
# ビルド検証
docker build -f Dockerfile.test -t test-app .