Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

ヒアドキュメント(Heredoc)とは、特別なコードブロックとして扱われる入力やファイルストリームのリテラルのことです。このコードブロックはコマンドへ渡されて処理されます。ヒアドキュメントはUNIXシェルに由来する機能で、sh、tcsh、ksh、bash、zsh、cshなど主要なLinuxシェルで利用できます。さらに、Perl、Ruby、PHPといった他のプログラミング言語でも同様の機能がサポートされています。

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

ヒアドキュメントは、2つの山括弧 (<<) の後にデリミタ(区切りトークン)を続けて記述します。そして、開始時に使ったのと同じデリミタでコードブロックを終了させます。デリミタの間に書かれた内容はすべてコードブロックとして扱われます。

以下の例を見てみましょう。コードブロックをcatコマンドにリダイレクトしています。ここではデリミタを「BLOCK」に設定し、同じ「BLOCK」で終了しています。

cat << BLOCK
	Hello world
	Today date is $(date +%F)
	My home directory = ${HOME}
BLOCK

注意: ブロックの開始と終了には、必ず同じデリミタを使用してください。

複数行コメントを作成する

bashでコーディングしたことがある方ならご存知かもしれませんが、bashはデフォルトではC言語やJavaのような複数行コメントをサポートしていません。ヒアドキュメントを活用すれば、この制限を回避できます。

これはbashが複数行コメントを公式にサポートしているわけではなく、あくまでテクニック(ハック)です。ヒアドキュメントをどのコマンドにもリダイレクトしなければ、インタプリタは単にコードブロックを読み込むだけで何も実行しません。

<< COMMENT
	This is comment line 1
	This is comment line 2
	This is comment line 3
COMMENT
シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

空白文字の扱い

デフォルトでは、ヒアドキュメントは空白文字(タブやスペース)を一切抑制しません。この動作を変更したい場合は、(<<) の後にダッシュ (-) を追加してからデリミタを指定します。こうするとすべてのタブが抑制されますが、スペースはそのまま残ります。

cat <<- BLOCK
This line has no whitespace.
  This line has 2 white spaces at the beginning.
    This line has a single tab.
        This line has 2 tabs.
            This line has 3 tabs.
BLOCK
シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

変数とコマンド置換

ヒアドキュメントは変数置換に対応しています。ユーザー定義変数でも環境変数でも利用可能です。

TODAY=$(date +%F)
	
cat << BLOCK1
# User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1

同様に、ヒアドキュメントのコードブロック内で任意のコマンドを実行することもできます。

cat << BLOCK2
$(uname -a) 
BLOCK2
シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

特殊文字のエスケープ

特殊文字をエスケープする方法はいくつかあります。個々の文字単位でエスケープするか、ドキュメント全体レベルでエスケープするかのいずれかです。

個別の特殊文字をエスケープするには、バックスラッシュ(\)を使用します。

cat << BLOCK4
$(uname -a)
BLOCK4

cat << BLOCK5
Today date is = ${TODAY}
BLOCK5

ブロック内のすべての特殊文字をまとめてエスケープするには、デリミタをシングルクォートまたはダブルクォートで囲むか、デリミタの直前にバックスラッシュを付けます。

cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1

cat << "BLOCK2"
I am running as = ${USER}
BLOCK2

cat << \BLOCK3
I am running as = ${USER}
BLOCK3
シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

実践的な活用例

ヒアドキュメントの構造と動作原理が理解できたところで、実際の活用例をいくつか見てみましょう。筆者がヒアドキュメントをよく使うのは、SSH経由でリモートサーバー上のコマンドブロックを実行する場合と、SQLクエリをヒアドキュメント経由で渡す場合の2つです。

以下の例では、SSH経由でリモートサーバー上のコードブロックを実行しています。

シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

次の例では、selectステートメントをpsqlに渡してデータベースに接続し、クエリを実行しています。これは、-fフラグで.sqlファイルを読み込ませる代わりに、bashスクリプト内で直接psqlのクエリを実行できる便利な方法です。

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK
シェルスクリプトでヒアドキュメント(Heredoc)を使いこなす方法

以上でこの記事は終わりです。ここで紹介した例以外にも、ヒアドキュメントでできることはまだまだたくさんあります。もしヒアドキュメントに関する便利なテクニックをお持ちでしたら、ぜひコメント欄で共有してください。多くの読者にとって役立つはずです。

  1. Googleファミリーリンクで子どものスマホのアプリをブロックする方法

    テクノロジーの進化とトレンドの変化は止まることを知らず、それに追いつくのは容易ではありません。特に小さな子どもがいる家庭では、保護者はこれまで以上に注意を払う必要があります。スマートフォンの普及と膨大な数のアプリにより、子どもの活動をすべて把握するのはほぼ不可能になりつつあります。多くの親は子どもの行動を逐一見守りたいと考えていますが、共働き世帯では24時間体制で監視するのは現実的ではありません。そこで頼りになるのが、Googleが提供する「Googleファミリーリンク」です。 Googleファミリーリンクを活用すれば、子どものスマートフォンの利用制限やアプリのブロックはもちろん、端末上で行わ

  2. Windows 10でSSHセキュアシェルを使う方法!おすすめクライアント5選を徹底解説

    パソコンをリモートデスクトップに接続したり、ネットワーク経由でデータを共有したりするには、セキュアシェル(SSH)が必要です。この記事では、Windows 10でSSHセキュアシェルを使用する方法について詳しく解説します。 SSHセキュアシェルは、デバイスとインターネットを含む任意のネットワーク間の通信システムと考えることができます。通信が暗号化されているため安全であり、ハッカーやスパイウェア、アドウェア、マルウェアなどから、ユーザーがどのサイトや場所にアクセスしているか、どこからデータを受信しているかといった情報を守ることができます。 Linux系OSはWindowsよりも安全性が高いと言わ