Có một cách bạn có thể nhận vấn đề này mà không gặp vấn đề xuống dòng hỗn hợp (ít nhất, trong vỏ của tôi, đó là GNU bash v4.3.30):
#!/bin/bash
# foo.sh
function foo() {
echo "I am quoting a thing `$1' inside a function."
}
while [ "$input" != "y" ]; do
read -p "Hit `y' to continue: " -n 1 input
echo
done
foo "What could possibly go wrong?"
$ ./foo.sh
./foo.sh: line 11: syntax error near unexpected token `done'
./foo.sh: line 11: `done'
Điều này là do bash mở rộng backticks bên trong chuỗi dụng dấu ngoặc kép (xem hướng dẫn bash trên quoting và command substitution), và trước khi tìm một backtick phù hợp, sẽ giải thích bất kỳ dấu ngoặc kép như một phần của lệnh thay thế:
$ echo "Command substitution happens inside double-quoted strings: `ls`"
Command substitution happens inside double-quoted strings: foo.sh
$ echo "..even with double quotes: `grep -E "^foo|wrong" foo.sh`"
..even with double quotes: foo "What could possibly go wrong?"
Bạn có thể giải quyết vấn đề này bằng cách thoát chuỗi sau bằng dấu gạch chéo ngược hoặc bằng cách sử dụng chuỗi được trích dẫn một lần.
Tôi không thực sự chắc chắn tại sao điều này chỉ đưa ra thông điệp một lỗi, nhưng tôi nghĩ rằng nó đã làm với định nghĩa hàm:
#!/bin/bash
# a.sh
function a() {
echo "Thing's `quoted'"
}
a
while true; do
echo "Other `quote'"
done
#!/bin/bash
# b.sh
echo "Thing's `quoted'"
while true; do
echo "Other `quote'"
done
$ ./a.sh
./a.sh: line 10: syntax error near unexpected token `done'
./a.sh: line 10: `done'
$ ./b.sh
./b.sh: command substitution: line 6: unexpected EOF while looking for matching `''
./b.sh: command substitution: line 9: syntax error: unexpected end of file
Thing's quote'
./b.sh: line 7: syntax error near unexpected token `done'
./b.sh: line 7: `done'
Mã của bạn là chính xác và hoạt động cho tôi bằng cách sử dụng ubuntu. Mã trên có phải là bản sao chép chính xác không? Đầu ra 'file file.sh' là gì? –
Vấn đề là gì? Nó chạy nhưng không hoạt động đúng không? Nó có chạy không? Nó có cung cấp cho bạn một số thông điệp không? Những chú ngựa paisley diễu hành quanh nhà bếp của bạn? – twalberg
@twalberg: Thông báo lỗi (tôi giả định) nằm trong tiêu đề. –