■ はじめに
シェルの可読性をあげるために よく使う「ヒアドキュメント」について、メモっておく。
目次
【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