Bash・Linuxシェルのヒアドキュメント(Heredoc)徹底解説チュートリアル
この記事では、Bash/シェルスクリプトでヒアドキュメント(Here Document)を使って複数行テキストを扱う方法を解説します。
ヒアドキュメントは複数行の入力を受け付ける際に最も便利です。ユーザーは1行目のテキストを入力してEnterキーを押し、続けて次の行を入力していくことができます。また、スクリプト内で複数行のテキストを定義する用途にも使えます。
さらに、対話型プログラムに複数のコマンドをまとめて送信することも可能です。具体的な例は記事の後半で紹介します。
この記事のサンプルはBashとZshの両方のシェルで動作します。
標準入力・パイプ・リダイレクトの基礎
ヒアドキュメントは、標準入出力やリダイレクト・パイプと組み合わせて使われることが多く、複数行テキストを他のコマンドに渡して処理・整形・表示させるのに役立ちます。この概念については別途詳しく説明しているので、まずは以下の記事を参照してください。
以降の例では、上記の記事で扱った概念や手法が何度か登場します。
Bash/Zshにおけるヒアドキュメントの構文
ヒアドキュメントを開始するには、<< を使います。これは前述の入出力リダイレクトの一種です。
基本的な構文は以下の通りです。
COMMAND <<LIMITSTRING text line 1 text line 2 ... LIMITSTRING
各要素の意味は次の通りです。
- COMMAND:任意のLinuxコマンドやスクリプトを指定できます。ヒアドキュメント内のテキストはリダイレクトによってコマンドへ送られます。
- <<:ヒアドキュメントの開始を定義します。
- 複数行テキストをインデントしたい場合は、<<-(ハイフン付き)を使用してください。各行の先頭にあるタブ文字が自動的に取り除かれます。
- LIMITSTRING:ヒアドキュメントへのテキスト入力を終了するための区切り文字列です。
- ヒアドキュメントは複数行であり、Enterキーで改行していくため、Enterキーでは入力を終了できません。
- LIMITSTRINGが現れた時点で「入力完了」と判断され、ヒアドキュメントが終了します。
- 区切り文字列は何でも構いません。ただし、本文中に出てこない文字列を選び、意図せず途中で終了しないように注意してください。
- 慣習的にはEOF(End Of File の略)がよく使われます。ただし、ヒアドキュメント内にEOFという文字列が含まれない場合に限ります。
- テキストの行数に制限はありません。好きなだけ行を追加できます。
ヒアドキュメントの実用例
複数行テキスト入力を受け付ける
次の例では、複数行のテキストを受け付け、catコマンドに渡して画面に表示します。
cat <<EOF This is line 1 This is line 2 EOF
この例はターミナルに直接入力して試すことができます。
変数を使う
ヒアドキュメント内ではシェル変数も利用できます。
cat <<EOF This is line 1 This is line 2 Your current directory is $PWD EOF
上記の例では、$PWD変数がヒアドキュメント内で展開され、現在の作業ディレクトリのパスが表示されます。
ヒアドキュメントの出力をリダイレクトする
標準的なリダイレクトを使えば、コマンドに渡された後のヒアドキュメントの内容を、別のプログラムやファイルへ送ることもできます。
cat <<EOF > output.txt This is line 1 This is line 2 Your current directory is $PWD EOF
上記の例では、catがヒアドキュメントの内容を読み込み、その出力が>によってoutput.txtファイルに書き込まれます。
スクリプト内で複数行テキストを定義する
ヒアドキュメントはスクリプトの中でも使えます。シェルスクリプトはシェルに順番に渡されるコマンドの羅列にすぎないため、動作は同じです。
スクリプトのコードを見やすくインデントしたい場合は、ヒアドキュメント宣言に-(ダッシュ)を追加しましょう。これにより、各行の先頭の空白(タブ)が自動的に除去されます。
#!/bin/bash
if $trueOrFalse; then
cat <<-EOF > output.txt
This is line 1
This is line 2
Your current directory is $PWD
EOF
fi
ヒアドキュメントを変数に代入する
catコマンドでヒアドキュメントの内容を読み込み、その出力を変数に代入することで、複数行テキストをスクリプト変数として保持できます。
mytext=$(cat <<-EOF
This is line 1
This is line 2
Your current directory is $PWD
EOF
)
echo $mytext
対話型プログラムに複数のコマンドを送る
ヒアドキュメントは、対話型プログラムに複数行のテキストを送ることにも使えます。一部のプログラムは起動後にユーザーがコマンドを入力することを想定しており、処理対象のテキストを受け取ったり、独自のシェルを提供したりします。
代表的な例がMySQLです。MySQLを起動してサーバーに接続すると、コマンドを入力してEnterキーを押すことでデータを照会できます。ヒアドキュメントを使えば、これらのコマンドをあらかじめ記述しておき、ユーザーの操作なしにMySQLへ送信できます。
mysql -uUSERNAME -pPASSWORD DATABASE <<EOF SHOW TABLES; SELECT * FROM posts; EOF
上記の例では、mysqlコマンドが指定したユーザー名(USERNAME)とパスワード(PASSWORD)でデータベース(DATABASE)に接続します。
接続が確立すると、2つのコマンドが連続して実行されます。1つ目はSHOW TABLESでテーブル一覧を表示し、2つ目はSELECTでpostsテーブルから全レコードを取得します。
-
Bash変数チュートリアル – 基本からグローバル変数・ローカル変数まで学べる6つの実用例
Bash変数は、プログラムの実行期間中に必要となる情報を一時的に保存しておくための仕組みです。本記事はBashチュートリアルシリーズの一篇で、他のプログラミング言語と同様にBashでも変数を利用できることを踏まえ、基本的な使い方からグローバル変数とローカル変数の違いまでを、6つの実用的なサンプルを通じて解説します。 Bash変数の基本構文 変数の定義は非常にシンプルで、次の書式に従います。 VARNAME=VALUE 注意: 変数へ代入する際は、「=」記号の前後にスペースを入れてはいけません。「VAR=VALUE」のように書けば、シェルは「=」を代入記号として認識し、この行を変数への代入とし
-
実用的な5つの例で学ぶBashスクリプト入門チュートリアル
Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この