ヒアドキュメント
システム管理者 Unixパワーユーザのためのコマンドリファレンス

[ Linux / Unix リファレンスガイド ] ⇒ [ シェルスクリプト ] ⇒ [ ヒアドキュメント ]



ヒアドキュメント


シェルスクリプトの記述時に、ヒアドキュメントというリダイレクト機能を用いることでさまざまなメリットがある。

#!/bin/sh
printf "1 hello\n"
printf "2 unix/n"
printf "3 world/n"


◆実行結果
1 hello
2 unix
3 world

というようなスクリプトが有る場合、メッセージの行ごとに printf改行コード \n を入力するのは少し使いづらい。このような場合、cat コマンドへのリダイレクトというかたちをとり、次のような記述でも同様の結果を得ることができる。

#!/bin/sh
cat << _EOH_
1 hello
2 unix
3 world
_EOH_


◆実行結果
1 hello
2 unix
3 world

というような出力結果が表示される。 ヒアドキュメントを用いれば可読性やメンテナンス性を高めたり、外部ファイルに記録させたくないファイルをスクリプト内に記述することが可能となる。上記は

1.複数行のメッセージを表示させる場合に、echo や printf を最低限にし、文章の書き換えを容易にする

と言うメリットがある。


2.HTML・XML・LaTeX などのファイルを出力したい場合

ヒアドキュメントで記述したHTMLを index.html に出力する例
※ << の代わりに <<- を用いることでTABによるインデントを無視できる

#!/bin/sh
cat <<- _HTML_ > index.html
   <html>
   <head><title>hello world</title></head>
   <body>
    hello world
   </body>
   </html>
_HTML_


3.for文などに読み込ませる変数が多い場合

for文の場合で延々と何十個も代入が続く場合、ヒアドキュメントを用いて下部に一行ごとに記述するとメンテナンス性や可読性が向上する。

◆for文で記述した場合、後々に登録するIDを書き換えする際、メンテナンスが大変で、作業ミスの原因にもなりうる。

#!/bin/sh
for list in lm0001 lm0002 lm0003 lm0004 lm0035 lm2001 lm2031 lm3001 lm3031 lm3305 lm3501 lm3699 lm4001 lm4002 lm5001 lm5002 lm5003 lm5005 lm6001 (延々と続く)
do
 echo ${list} 
done

◆ヒアドキュメントを利用して代入する値を外部に整理すると、見やすく後々のメンテナンスもやりやすい。可読性が高いため作業ミスを減らすメリットもある。

#!/bin/sh 
while read list 
do
   echo ${list}  
done << _LIST_ 
lm0001 
lm0002 
lm0003 
lm0004 
lm0035 
(延々と続く)
 _LIST_ 


4.サーバへの接続

その他に、ヒアドキュメントはFTPサーバへの接続・SQL文の発行などでも利用される。これについては、他のコーナーで取り上げるか、後日追記したい。