Chạy hai lệnh trong trường hợp | | hoặc là &&


10

Tôi đã đọc về && và || và tôi muốn chạy hai lệnh trong trường hợp sai.

Tôi đã thử ;nhưng đó là chạy luôn . Tôi đã thử đặt nó trong dấu ngoặc nhọn { command1; command2 }nhưng kết quả là lỗi cú pháp.

Tôi muốn làm một cái gì đó như

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

chỉ thoát khi không có kết nối Internet.


1
Điều này có vẻ như một lỗi đánh máy đơn giản. Một cách thú vị hơn để hỏi là sự khác biệt giữa (){}.
edwinksl

Câu trả lời:


26

Sử dụng parens đặt các lệnh trong một lớp con không phải luôn luôn là những gì bạn muốn. Ngoài ra, sử dụng niềng răng xoăn:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Thủ thuật ở đây là, không giống như parens, lệnh cuối cùng trong niềng răng phải được tuân theo ;.

Tại sao cần có dấu chấm phẩy hoặc dòng mới

Một dấu ngoặc nhọn là một đối số hợp lệ cho một lệnh. Ví dụ, đây là một dấu ngoặc nhọn làm đối số cho echo:

$ echo }
}

Do đó, nếu vỏ thấy:

{ command1; command2 }

Shell diễn giải lệnh1 là không có đối số và lệnh2 là có một đối số bao gồm ký tự }. Một dấu ngoặc nhọn }chỉ được hiểu là đóng một nhóm nếu nó theo dấu chấm phẩy hoặc dòng mới. Để thực hiện các công việc trên:

{ command1; command2; }

Subshells và sự khác biệt giữa {...}(...)

Quan sát rằng các bộ sau đây xthành 10 nhưng cài đặt đó bị quên trước khi echolệnh chạy:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Ngược lại, với dấu ngoặc nhọn, cài đặt x=10được ghi nhớ:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Sự khác biệt là bởi vì các phép gán biến trong một lớp con không tồn tại sau khi lớp con hoàn thành.

Tài liệu

Từ man bash:

(danh sách)

danh sách được thực thi trong môi trường mạng con (xem MÔI TRƯỜNG THỰC HIỆN QUY TẮC bên dưới). Các phép gán biến và các lệnh dựng sẵn ảnh hưởng đến môi trường của shell không còn hiệu lực sau khi lệnh hoàn thành. Trạng thái trả về là trạng thái thoát của danh sách.

{ danh sách; }

danh sách được thực hiện đơn giản trong môi trường shell hiện tại. danh sách phải được chấm dứt bằng một dòng mới hoặc dấu chấm phẩy. Điều này được gọi là một lệnh nhóm. Trạng thái trả về là trạng thái thoát của danh sách. Lưu ý rằng không giống như các siêu ký tự (và), {và} là các từ dành riêng và phải xảy ra khi một từ dành riêng được phép được công nhận. Vì chúng không gây ra ngắt từ, chúng phải được tách ra khỏi danh sách bằng khoảng trắng hoặc metacharacter vỏ khác.

[Nhấn mạnh thêm]

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.