関数と関数呼び出しを含むスクリプトがあります。関数の内部には次の文書があります。
#!/bin/bash
DWA() {
......
mysql -u root -p <<-MYSQL
......
MYSQL
}
DWA
質問
ここでは、ドキュメントの区切り文字に関連するエラーが原因で実行が中断されました(区切り文字のインデントによって発生した可能性がありますMYSQL
)。
すべての先頭行(スペース/タブ)を削除しても問題は発生しません。
私の質問
関数がすべての先行タブを削除することを考慮すると(スペースなどの他の種類の先行についてはわかりません)、なぜこの問題が発生し、解決するにはどうすればよいですか?
ベストアンサー1
区切られた文書をインデントするためにタブを使用しないことがあります。 Heredocのすべての行は、最初の行(区切り文字が挿入されている場所)を含むタブを使用してインデントする必要があります。以下はテストケースです。
echo -e 'function heredoc() {\n\tcat <<-HEREDOC\n\t\tThis is a test\tHEREDOC\n} heredoc' > heredoc.sh
コマンドを実行したら、heredoc.sh
以下を実行してみてください。
This is a test.
または、ここに同じスクリプトがありますが、最初の行はタブの代わりにスペースでインデントされています。
echo -e 'function heredoc() {\n cat <<-HEREDOC\n\t\tThis is a test\tHEREDOC\n} heredoc' > heredoc2.sh
実行すると、heredoc2.sh
次のエラー出力が表示されます。
bash heredoc2.sh
heredoc2.sh: line 4: warning: here-document at line 2 delimited by end-of-file (wanted `HEREDOC')
heredoc2.sh: line 5: syntax error: unexpected end of file