Những gì bạn đã viết thực sự gần như hoạt động (nó sẽ hoạt động nếu tất cả các biến là số), nhưng đó không phải là một cách thành ngữ.
(…)
dấu ngoặc chỉ ra một subshell . Những gì bên trong chúng không phải là một biểu thức như trong nhiều ngôn ngữ khác. Đây là danh sách các lệnh (giống như dấu ngoặc đơn bên ngoài). Các lệnh này được thực thi trong một quy trình con riêng biệt, do đó, bất kỳ chuyển hướng, gán, v.v. được thực hiện bên trong dấu ngoặc đơn đều không có tác dụng bên ngoài dấu ngoặc đơn.
- Với ký hiệu đô la hàng đầu,
$(…)
là sự thay thế lệnh : có một lệnh bên trong dấu ngoặc đơn và đầu ra từ lệnh được sử dụng như một phần của dòng lệnh (sau khi mở rộng thêm trừ khi thay thế nằm giữa dấu ngoặc kép, nhưng đó là một câu chuyện khác ) .
{ … }
dấu ngoặc nhọn giống như dấu ngoặc đơn ở chỗ chúng nhóm các lệnh, nhưng chúng chỉ ảnh hưởng đến phân tích cú pháp, không nhóm. Chương trình x=2; { x=4; }; echo $x
in 4, trong khi x=2; (x=4); echo $x
in 2. (Ngoài ra, dấu ngoặc nhọn yêu cầu khoảng trắng xung quanh chúng và dấu chấm phẩy trước khi đóng, trong khi dấu ngoặc đơn thì không. Đó chỉ là một cú pháp.
- Với một ký hiệu đô la hàng đầu,
${VAR}
là một mở rộng tham số , mở rộng đến giá trị của một biến, với các biến đổi bổ sung có thể.
((…))
dấu ngoặc kép bao quanh một lệnh số học , nghĩa là tính toán trên các số nguyên, với một cú pháp giống với các ngôn ngữ lập trình khác. Cú pháp này chủ yếu được sử dụng cho các bài tập và trong các điều kiện.
- Cú pháp tương tự được sử dụng trong các biểu thức số học
$((…))
, mở rộng thành giá trị nguyên của biểu thức.
[[ … ]]
dấu ngoặc kép bao quanh biểu thức điều kiện . Các biểu thức điều kiện hầu hết được xây dựng trên các toán tử như -n $variable
để kiểm tra xem một biến có trống không và -e $file
để kiểm tra nếu một tệp tồn tại. Ngoài ra còn có các toán tử đẳng thức chuỗi: "$string1" == "$string2"
(hãy cẩn thận rằng phía bên tay phải là một mẫu, ví dụ: [[ $foo == a* ]]
kiểm tra nếu $foo
bắt đầu a
trong khi [[ $foo == "a*" ]]
kiểm tra nếu $foo
chính xác a*
), và các toán tử quen thuộc !
, &&
và ||
phủ định cũng như dấu ngoặc đơn để phân nhóm. Lưu ý rằng bạn cần một khoảng trắng xung quanh mỗi toán tử (ví dụ: [[ "$x" == "$y" ]]
không [[ "$x"=="$y" ]]
) và khoảng trắng hoặc ký tự như ;
cả bên trong và bên ngoài dấu ngoặc (ví dụ: [[ -n $foo ]]
không[[-n $foo]]
).
[ … ]
dấu ngoặc đơn là một dạng thay thế của các biểu thức điều kiện có nhiều quirks hơn (nhưng cũ hơn và dễ mang theo hơn). Đừng viết bất cứ điều gì cho bây giờ; bắt đầu lo lắng về chúng khi bạn tìm thấy các tập lệnh có chứa chúng.
Đây là cách thành ngữ để viết bài kiểm tra của bạn trong bash:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Nếu bạn cần tính di động đối với các shell khác, đây sẽ là cách (lưu ý trích dẫn bổ sung và các bộ dấu ngoặc riêng biệt xung quanh từng thử nghiệm riêng lẻ và sử dụng =
toán tử truyền thống thay vì ==
biến thể ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then