Trường hợp tiếp tục dòng bash sau && và || Tài liệu?


28

Tôi đã thấy cấu trúc này trong các kịch bản rất nhiều và tự mình sử dụng nó, nhưng điều đó làm phiền tôi rằng dường như tôi không thể tìm thấy nó trong tài liệu.

Thí dụ:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

Điều này cũng có thể được thực hiện với dấu gạch chéo ngược trước dòng mới, như được đề cập trong man bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

Thí dụ:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... nhưng điều này dường như không cần thiết. Phiên bản đầu tiên ở trên hoạt động ngay cả khi không có dấu gạch chéo ngược.

Tôi có thể tìm thấy cái này ở man bashđâu? (Ngoài ra, điều này bashcụ thể hay tuân thủ POSIX?)


Nếu bạn đang tìm kiếm tài liệu bash hoặc POSIX chính thức, hãy xem câu trả lời của Gilles. Nhưng điều này được thảo luận trong các toán tử điều khiển và chuyển hướng của shell là gì? - Nhiều quan sát trên ;, &, () .
G-Man nói 'Phục hồi Monica'

@ G-Man, tôi đoán điều đó không nhắm vào tôi? Chỉ dành cho độc giả tương lai? Như tôi đã nói trong câu hỏi, "điều đó làm phiền tôi rằng tôi dường như không thể tìm thấy nó trong tài liệu." Tôi đã biết làm thế nào nó hoạt động, vì vậy đây thực sự chỉ là một yêu cầu cho các tài liệu chính thức. :)
tự đại diện

Ngay cả trong trường hợp mảng, vẫn có một dòng tiếp tục ẩn : names=( Rama Soma<newline> Sita Diya ). Python mô tả rõ ràng những điều này ở đây nhưng tài liệu Bash dường như không.
jamadagni

Câu trả lời:


39

Một dòng mới được bỏ qua trong một vài bối cảnh trong đó rõ ràng là một lệnh bị hủy. Những bối cảnh bao gồm sau khi một nhà điều hành kiểm soát ( &&, ||, |, &, ;, ;;, nhưng không phải !).

Tôi không thấy tài liệu này trong tài liệu hướng dẫn bash.

Trong POSIX, nó được chỉ định thông qua các quy tắc ngữ pháp . Bất cứ nơi nào các quy tắc có linebreak, bạn có thể có 0 hoặc nhiều ngắt dòng.


+1, tôi không biết nó hoạt động cho đường ống đơn giản (|). Tôi ước chúng ta cũng có thể đặt chúng ở dòng tiếp theo, để dễ đọc, nhưng nó không hoạt động theo cách đó (nếu làm điều đó, bạn cần phải theo dõi dòng mới trước đó).
Olivier Dulac

1
@OlivierDulac Làm thế nào điều đó có thể làm việc? Khi nó xử lý dòng lệnh hiện tại, làm thế nào để biết rằng bạn dự định gõ |ở đầu dòng tiếp theo? Hãy nhớ rằng, shell cũng được sử dụng tương tác, không chỉ trong các tập lệnh và ngữ pháp cũng vậy.
Barmar

@Barmar: Tôi biết, tôi biết điều này (đã viết trình biên dịch ở trường ^^) ... Tôi đã nói "Tôi ước", và đó không phải là một điều ước rất chính đáng
Olivier Dulac

1
@DocSalvager, bạn có thể đưa ra một ví dụ về lỗi logic sẽ giúp ngăn chặn? Tôi có một thời gian khó khăn để nhìn thấy nó ....
Wildcard

2
@DocSalvager, tôi thực sự sẽ không sử dụng mã khi tôi viết nó, đó là một minh họa. Mặc dù không có dòng cuối cùng (mệnh đề khác), tôi sẽ sử dụng nó theo cách đó. (Đối với "nếu điều này và điều này sau đó làm điều đó" this && this2 && thatthì tốt nhưng với một elseđiều khoản tôi sẽ sử dụng thực tế if then else fi.)
Wildcard
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.