技術系TIPS
PR

シェルスクリプトのヒアドキュメントの中で変数やコマンドを展開しない

saratogax
記事内に商品プロモーションを含む場合があります

多くの言語において標準で利用できるヒアドキュメント。

便利ですよね。

そんな中、シェルスクリプトのヒアドキュメントの書き方で知らない文法に遭遇。

なんと、区切り文字を特定の文字で囲んだ時に、中の変数やコマンドを展開しないというもの。

変数展開をさせたいケースの方が多いと思いますが、今回はこの展開しない方法を紹介していきます。

ヒアドキュメント

通常のヒアドキュメントは、指定コマンドへの標準入力になります。

例えば、以下の場合なら cat に対して標準入力で EOL で囲まれた内容が渡されます。
(EOL の部分は任意の文字列で大丈夫です)

#!/bin/sh

a="rilakkuma"
cat << EOL
[animal]
${a}
EOL

結果は以下の通りですね。変数 a の内容が展開されています。

[animal]
rilakkuma

冒頭で書いた通り、コマンドも展開できます。

#!/bin/sh

a="rilakkuma"
cat << EOL
[animal]
${a}
`echo ${a} | tr a-z A-Z`
EOL

rilakkuma(リラックマ)のアルファベットが大文字になりましたね。

[animal]
rilakkuma
RILAKKUMA

変数やコマンドを展開しない

では、ヒアドキュメントの中で変数やコマンドをそのまま出力したい場合はどうしたらいいか。

こんなケースは稀だと思いますが、シェルの中で SQL(クエリ)など何かのコマンドを作成したいケースもあるかもしれません。

そんな時は、先頭の区切り文字をダブルクォーテーションまたはシングルクォーテーションで囲みます。

先ほどのシェルを変更して実行してみます。

#!/bin/sh

a="rilakkuma"
cat << "EOL"
[animal]
${a}
EOL

結果は以下の通り。

[animal]
${a}

もちろん、コマンドも展開されません。

#!/bin/sh

a="rilakkuma"
cat << "EOL"
[animal]
${a}
`echo ${a} | tr a-z A-Z`
EOL

想定通りですね。

[animal]
${a}
echo ${a} | tr a-z A-Z

まとめ

シェルスクリプトのヒアドキュメントについて、変数やコマンドを展開しない方法を紹介してきました。

使う場面は限られると思いますが、ちょっとシェルで特殊なコマンドを生成したい場合などに利用できそうですね。

特に SQL(クエリ)のコマンドは以下の文字を使う場面が多々あります。

・ダブルクォーテーション
・シングルクォーテーション
・バッククォート

無理に覚える必要はありませんが、そんなこともできたなって頭の片隅に入れておくといいかもしれませんね。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました