【Shell】ヒアドキュメント ~ 複数行の テキストをファイル出力する ~

■ はじめに

シェルの可読性をあげるために
よく使う「ヒアドキュメント」について、メモっておく。

目次

【1】ヒアドキュメント
【2】構文
 1)Case1
 2)Case2
【3】使用上の注意
 1)if 文内で使う場合も空白行に注意
【4】サンプル
 1)Case1
 2)Case2
【5】おまけ:複数行の文字列を変数に格納

 【1】ヒアドキュメント

 * 複数行の文字列を簡潔に記述するための機能

 【2】構文

1)Case1

cat > 【出力ファイル】 <<【任意文字】
【内容1】
【・・・】
【任意文字】

2)Case2

# 上書きモード(【任意文字】> 【出力ファイル】)
cat <<【任意文字】> 【出力ファイル】 
【内容1】
【・・・】
【任意文字】

# 追記モード(【任意文字】>> 【出力ファイル】)
cat <<【任意文字】>> 【出力ファイル】 
【内容1】
【・・・】
【任意文字】

【3】使用上の注意

1)if 文内で使う場合も空白行に注意

* if文内で使う場合は、空白行を入れないこと
 => 以下のサイトおよび後述「NGケース・OKケース」を参照のこと

https://stackoverflow.com/questions/9349616/bash-eof-in-if-statement

Drop the blanks and it should work:

    EOF
^^^^

NGケース

#!/bin/bash

cat <<EOF >> output.txt
Hello
EOF

FLAG="true"

if [ "$FLAG" = "true" ]; then
  cat <<EOF >> output.txt
  World
  EOF
else
  echo "Skip"
fi

OKケース

#!/bin/bash

cat <<EOF >> output.txt
Hello
EOF

FLAG="true"

if [ "$FLAG" = "true" ]; then
  cat <<EOF >> output.txt
  World
  EOF
else
  echo "Skip"
fi

【4】サンプル

Case1

SayHello.sh

#!/bin/bash

cat > HelloWorld.txt <<EOF
Hello, $1
How are you?
EOF

出力例

SayHello.sh Mike

出力結果:HelloWorld.txt

Hello, Mike
How are you?

Case2

#!/bin/bash

cat <<EOF >> output.txt
Hello
World!!
# comment
Thank you for your watching me...
EOF

【5】おまけ:複数行の文字列を変数に格納

 ヒアドキュメントの応用として、
複数行の文字列を変数に格納する方法について、とりあげる。

サンプル

#!/bin/bash

sql=`cat << EOS
  SELECT
    user_id,
    user_name,
    created_at
  FROM
    users
  WHERE
    user_name = 'Sam'
  ;
EOS
`

echo "sql=${sql}"

参考文献

http://qiita.com/take4s5i/items/e207cee4fb04385a9952

関連記事

ファイルへの書き出し
https://dk521123.hatenablog.com/entry/2021/08/14/000000
リダイレクト・パイプライン
https://dk521123.hatenablog.com/entry/2021/09/13/000000