Làm thế nào để sử dụng một heredoc bên trong một hàm bash?


12

Có thể chèn một heredoc bên trong một hàm bash?

Mẫu tầm thường dưới đây dẫn đến một lỗi: ./heredoc_in_function.sh: 10: Syntax error: end of file unexpected (expecting "}")

#!/bin/sh

my_function () {
cat <<HEREDOC
heredoc contents
HEREDOC
}

my_function

Môi trường:

  • Ubuntu 11.04 (GNU / Linux 2.6,38-8-máy chủ x86_64)
  • GNU bash, phiên bản 4.2.8 (1) -release (x86_64-pc-linux-gnu)

Tôi đã có ấn tượng rằng heredoc là một thứ Perl. Có bất kỳ lý do để tin rằng nó sẽ hoạt động trong BASH?
jdw

@jdw, ở đây tài liệu có mặt ở nhiều ngôn ngữ bao gồm cả bash.
Zoredache

Tôi thấy điều đó bây giờ. Mát mẻ.
jdw

Câu trả lời:


10

Mã của bạn trông ổn đối với tôi, vì vậy tôi đã sao chép dòng này cho dòng và nó hoạt động với tôi trên:

  • OSX 10.7, bash 3.2.48 (1) -release (x86_64-apple-darwin11).
  • Ubuntu 10.04.3, bash 4.1.5 (1) -release (x86_64-pc-linux-gnu)

Bạn có thể nhập lại tệp bằng tay chỉ để đảm bảo bạn không bị thiếu hoặc thêm khoảng trắng / tab / vv?

Ngoài ra, làm thế nào bạn đang thực hiện nó? Tôi đã làm một chmod +x test.shvà sau đó./test.sh

EDIT: Tôi đã nhận được lỗi tương tự như bạn khi tôi thêm một khoảng trắng ở đầu dòng với HEREDOC đóng.

Lưu ý thêm: Một khoảng trống phía sau đóng cửa HEREDOCcũng có thể gây ra điều này


1
Thật kỳ lạ, bây giờ nó hoạt động ... Làm nổi bật cú pháp màu Vim đã nhận ra HEREDOC trước đó (không phải nếu bạn thêm khoảng trống đó trước khi đóng HEREDOC) Tôi đã sửa đổi tập lệnh gốc thành chỉ sử dụng một tệp bên ngoài, vì vậy tôi không chắc chắn điều gì đã sai Nó sẽ thuận tiện hơn nhiều với heredocs, mặc dù!
Leftium

1
Thật! Tôi yêu tôi một số heredocs.
David

1
Ngoài ra: Một khoảng trống phía sau đóng HEREDOCcũng có thể gây ra điều này (Những loại lỗi này thực sự khó theo dõi. Thở dài.)
0laf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.