Lỗi cú pháp tại dấu chấm phẩy trong tập lệnh shell


7

Lệnh one liner sẽ dài hơn nhưng đây là phần gây ra lỗi.

for user in natural1 ; do 
cat <<EOT >> /home/$user/public_html/.htaccess
<FilesMatch "wp-login.php">
AuthType Basic
AuthName "Secure Area"
AuthUserFile "/home/$user/.htaccesspasswd"
require valid-user
</FilesMatch>
EOT
; done

-bash: syntax error near unexpected token `;'

4
loại bỏ ;trong ; done. bash không phải là C. bash là cáu kỉnh nếu bạn thêm không cần thiết; nơi bạn đã có dòng mới
frostschutz

Đơn giản, tôi đã có ấn tượng luôn luôn cần thiết khi đóng câu lệnh, cảm ơn nhiều!
JCats

1
Trên thực tế bash coi ;như một breakbreak. Vì vậy, bạn có thể sử dụng dấu chấm phẩy giữa Natural1 và do, hoặc đặt làm trên dòng tiếp theo. Cả hai sẽ là cú pháp hợp lệ. Rất nhiều lập trình viên sử dụng dấu chấm phẩy vì họ thấy nó gọn gàng hơn để chứa khai báo vòng lặp thành một dòng duy nhất. Bởi vì điều này không bao giờ có ý nghĩa để bắt đầu một dòng với ;bash mà tôi có thể nghĩ đến.
Centimane

Câu trả lời:


12

Dấu chấm phẩy hoặc ký hiệu ( ;hoặc &) trong tập lệnh shell là dấu kết thúc lệnh. Bạn không thể sử dụng nó nếu nó không tuân theo lệnh. ;có nghĩa là Viking chạy lệnh trước trong foreground và &có nghĩa là chạy lệnh trước trong nền trước.

Một dòng mới trong một kịch bản shell là một bộ kết thúc lệnh yếu kém. Nếu có lệnh chấm dứt, nó tương đương với dấu chấm phẩy. Nếu không có lệnh chấm dứt, dòng mới không có hiệu lực.

Dòng mới sau khi cat <<EOT >> /home/$user/public_html/.htaccesschấm dứt cat …lệnh. Vì vậy, dấu chấm phẩy sau tài liệu ở đây không có gì để chấm dứt. (Tài liệu ở đây không phải là lệnh; tài liệu ở đây được đính kèm với lệnh trên dòng trước, tức là cat …lệnh.) Nếu bạn muốn chấm dứt rõ ràng cat …lệnh bằng dấu chấm phẩy, bạn cần đặt nó tại cuối cat …dòng.


Câu trả lời của bạn đã đúng trong năm 2015, nhưng ngày nay nó không còn đúng 100% nữa. Một dòng lệnh bắt đầu bằng dấu chấm phẩy không còn là một lỗi.
schily

1
@schily Trên máy tôi đang sử dụng ngay bây giờ, dash, bash, lksh, mksh, posh và Busybox sh đều phàn nàn về việc dẫn đầu ;. Chỉ có ksh93 và zsh hài lòng với nó. Câu trả lời của tôi áp dụng cho các hệ thống mà mọi người có thể gặp phải, không phải những gì dự thảo POSIX mới nhất nói.
Gilles 'SO- ngừng trở nên xấu xa'

ksh93thực hiện nó từ một thời gian dài hơn và tôi đã thực hiện nó trong boshmột năm trước sau khi chúng tôi quyết định thay đổi cú pháp POSIX vào năm ngoái. Tôi muốn giải thích rằng có xu hướng cho phép nó mặc dù thay đổi này vẫn không cho phép, ví dụ { ;.
schily
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.