シェルスクリプトのヒアドキュメントの中で変数やコマンドを展開しない
多くの言語において標準で利用できるヒアドキュメント。
便利ですよね。
そんな中、シェルスクリプトのヒアドキュメントの書き方で知らない文法に遭遇。
なんと、区切り文字を特定の文字で囲んだ時に、中の変数やコマンドを展開しないというもの。
変数展開をさせたいケースの方が多いと思いますが、今回はこの展開しない方法を紹介していきます。
ヒアドキュメント
通常のヒアドキュメントは、指定コマンドへの標準入力になります。
例えば、以下の場合なら 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(クエリ)のコマンドは以下の文字を使う場面が多々あります。
・ダブルクォーテーション
・シングルクォーテーション
・バッククォート
無理に覚える必要はありませんが、そんなこともできたなって頭の片隅に入れておくといいかもしれませんね。