ヒアドキュメントとヒアストリング

ヒアドキュメントの基本(<<)

複数行の文字列をコマンドの標準入力として渡す方法です。終端文字(この例では END)までの内容が入力として扱われます。

code
cat << 'END'
こんにちは。
これはヒアドキュメントの
テスト用メッセージです。
END
stdout
こんにちは。
これはヒアドキュメントの
テスト用メッセージです。

変数展開の制御

クォートなし(変数を展開する)

終了文字をクォートせずに記述すると、ヒアドキュメント内の変数が展開されます。

code
msg='こんにちは'
cat << END
メッセージ: ${msg}
END
stdout
メッセージ: こんにちは

シングルクォートあり(変数を展開しない)

終了文字をシングルクォートで囲むと、変数は展開されず、記述したそのままの文字列が出力されます。

code
msg='こんにちは'
cat << 'END'
メッセージ: ${msg}
END
stdout
メッセージ: ${msg}

インデントの無視(<<-)

「<<-」を使用すると、行頭にあるタブ文字が無視されます。if 文や関数の内部など、スクリプトのインデントを維持したままヒアドキュメントを記述したい場合に便利です。

code
if true; then
	cat <<- 'END'
		1行目のインデント(タブ)は無視されます
		2行目も同様です
	END
fi
stdout
1行目のインデント(タブ)は無視されます
2行目も同様です

ファイルへの書き出し

リダイレクト(>)と組み合わせて、CSV形式などの複数行テキストを一括でファイルに保存する際によく利用されます。

code
cat << 'END' > fruits.csv
品名,個数,単価
りんご,10,120
バナナ,5,200
みかん,20,50
END

cat fruits.csv
stdout
品名,個数,単価
りんご,10,120
バナナ,5,200
みかん,20,50

ヒアストリングの基本(<<<)

1行の短い文字列をコマンドに渡す際に使用します。パイプ(echo | command)を使うよりも簡潔に記述できます。

code
grep '挨拶' <<< '挨拶: こんにちは'
stdout
挨拶: こんにちは

変数の内容を渡す

変数の内容をそのままコマンドの標準入力として渡すことができます。

code
text='りんご があります'
# 「りんご」を「みかん」に置換
sed 's/りんご/みかん/' <<< "${text}"
stdout
みかん があります