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 {...}
và(...)
Quan sát rằng các bộ sau đây x
thành 10 nhưng cài đặt đó bị quên trước khi echo
lệ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]
()
và{}
.