Memoize

BasicWerk   EC Support   Technique   Facebook  

20140816113422_zsh_heredoc

zsh_heredoc

 

ヒアドキュメントとは「ファイルを用意するのは面倒臭いからここに書いちゃうね」という意味である。

だから、ヒアドキュメントはファイルを偽装した文字列だとみなせる。

 
% cat <<EOT
heredoc> aaa
heredoc> bbb
heredoc> ccc
heredoc> EOT
aaa
bbb
ccc
 
% sed 's/[0-9] //' <<EOT 
1 begin
2 execute
3 commit
EOT
begin
execute
commit
 

 

上の sed の例がそうだけど、正規表現を試すときにいちいちファイルを用意するのが面倒なときなどは本当に便利だ。

 

繰り返しになるが、ヒアドキュメントはファイルを偽装したものだから、文字列を必要とするコンテクストでは使えない。

例えば変数への代入や echo コマンドなど。

 
# 以下はecho が出力する改行文字しか表示されない
% str=<<EOT
heredoc> jajaja
heredoc> gagaga
heredoc> fufufu
heredoc> EOT
% echo "$str"
 
% echo <<EOT
heredoc> sasasa
heredoc> gugugu
heredoc> bububu
heredoc> EOT
 

 

もし、変数にヒアドキュメントで書いたものをバインドしたければ、cat などで読みだした文字列として与えれば良い。

 
% str=$(cat <<EOT
foo is foo
bar is bar
EOT
)
 
% echo "$str"    
foo is foo
bar is bar
 

 

 

紛らわしいのはヒアストリングだ。

「ヒアストリング」という名前的に文字列を生成してくれるように思ってしまうが、そうではない。

ヒアストリングは単なるヒアドキュメントのシンプル版である。

 
# これは上手く行かない
% str=<<<"foo is foo
dquote> bar is bar
dquote> "
% echo "$str"
 

 

 

ヒアドキュメントの小技を2つ。

 

ヒアドキュメントの終端文字宣言をシングルクォーテーションで囲ってやると、文字列全体がシングルクォートされた状態になる。

(ちなみにヒアストリングで <<<' とした場合も同じ。)

 
% var="aaa"
% cat <<'EOT'
heredoc> $var has "aaa"
heredoc> EOT
# $var が "aaa" に展開されずにそのまま表示される
$var has "aaa"
 

ちなみに終端文字を 'EOT' とする必要はない。

 

シェルスクリプトの中でヒアドキュメントを書くときにコーディング上インデントを揃えたい時がある。

通常の << だと、入力したインデントがそのまま表示されてしまうが、<<- とすればインデントに使った行頭の TAB 文字を無視して表示してくれる。

ちなみに無視してくれるのは TAB 文字だけだ。

 
# 行頭のスペースに見えるのは全て TAB
if [[ $? -eq 0 ]] then
    cat <<-EOT
        SUCCESS.
        GO NEXT.
    EOT     
fi
# 表示
SUCCESS.
GO NEXT.
 
# TAB と、スペース 4 個で作った見せかけの TAB を併用する
# aaa の前には TAB しかない
# bbb の前には先に TAB 1つ、続いて半角スペース 4 個がある
% cat <<-EOT
heredocd>       aaa
heredocd>           bbb
heredocd>           bbb
heredocd>       aaa
heredocd> EOT
aaa
    bbb
    bbb
aaa
 

 


© Shin Nakamura/BasicWerk 2014