Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
167
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@kite_999

知ると便利なヒアドキュメント

知ると便利なヒアドキュメント

よく、コマンドを実行する時に引数としてファイルを指定して、その中に書かれた物を使うといった物がある。例えばsftpのコマンド。更にはsshのキーファイルやpgpass、rsyncのエクスクルードなどなど。そういうコマンドをシェルから呼ぶ時にヒアドキュメントを使うと綺麗にかけたりすることがあります。
複数行に渡るファイルをシェルから作るときもechoを連発する必要もなくなります。

ヒアドキュメントとは

echo line1
echo line2
echo line3

上記のような事を下記に置き換える事ができます。

cat <<EOF
line1
line2
line3
EOF

シンプルですね。
ファイルを作りたいときはリダイレクトするだけです。

cat <<EOF > test
line1
line2
line3
EOF

これだけで複数行に渡ったファイルを作れます。
シェルスクリプトの中でちょっとしたファイルや接続ファイル、エクスクルードファイルなどが必要な時、シェルスクリプトに含める事ができます。

ヒアドキュメントは標準入力として扱われます。文字列リテラルではありません。
従ってファイルを作る時もechoに渡すのではなく、catを使用しています。

文法

cat <<EOF > test
line1
line2
line3
EOF

コマンドに<< EOSが渡されると次の行からEOSが単独で現れる行までの間が
ヒアドキュメントの内容になります。
EOSの部分は任意の文字を使うことができます。
また「EOSが単独で現れる行」というのは空白やタブも含んではいけません。

行頭のタブを取り除く

ヒアドキュメントは便利ですが、インデントできないのが難点です。
EOSをインデントしてしまうとヒアドキュメントの終わりとして認識してくれませんし、
ヒアドキュメントの内容にインデントがそのまま反映されてしまいます。
この問題を解決するための機能が用意されていて、<<を<<-に書き換えるだけで
使用できます。<<-でヒアドキュメントを書くと、行頭のタブを無視してくれます。
ただ、やはり空白だけは無視してくれません。

cat <<-EOF > test
\t\tline1
\tline2
\t\tline3
\tEOF
testファイル
        line1
    line2
        line3

変数展開をやめさせる

EOFをクォートします。

HOGE=hogehoge
cat <<'EOF' > test
line1
lne2
line3
$HOGE
EOF

としておけば下記のように$HOGEは文字列として扱われます。

testファイル
line1
line2
line3
$HOGE

応用

ファイルを作るだけなく色々な所で役に立ちます。

sftp -oPort=2222 -oIdentityFile=hoge hoge@hogehoge.hogehoge.hoge << EOF
cd /tmp
put hoge1
cd /home
put hoge2
put hoge3
quit
EOF

注意

便利ですが、パスワードファイルやキーファイルをシェルで作成する時は
シェルファイル自体のパーミッション、オーナーに十分注意しましょう。

167
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
167
Help us understand the problem. What is going on with this article?