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 |