2010-08-07 44 views
7

Trong các hướng dẫn và tập lệnh khác nhau, tôi bắt gặp mọi người có xu hướng sử dụng cú pháp khác nhau của câu lệnh if. Sự khác biệt và phương pháp hay nhất là gì? Tôi tin rằng tất cả các tuyên bố sau và nhiều biến thể khác, sẽ trả về giá trị thực:bash/sh nếu cú ​​pháp câu lệnh

bar="foo" 
if [ "foo" = "foo" ] 
if [[ "foo" == $bar ]] 
if [ "foo" = "$bar" ] 
if [[ "foo" = "$bar" ]] 
if [[ "foo" -eq $bar ]] 
+1

có thể trùng lặp với [bash: dấu ngoặc kép hoặc dấu ngoặc đơn, dấu ngoặc đơn, dấu ngoặc nhọn] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

+0

Đọc http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls – Philipp

Trả lời

5

Theo tôi được biết

= hy vọng chuỗi

-eq hy vọng số nguyên

"$ bar" là dành cho các trận đấu theo nghĩa đen, tức là z * Có thể mở rộng nhưng "z *" theo nghĩa đen sẽ phù hợp với ký tự đại diện char.

Sự khác biệt giữa [] và [[]] là trong việc tách từ sau và mở rộng tên đường dẫn không được thực hiện, nhưng ở trước đây.

Plus [[]] cho phép các nhà khai thác thêm:

& & (AND), || (OR), > (Chuỗi1 lexically lớn hơn String2), < (Chuỗi1 lexically ít hơn String2)

Các toán tử so sánh == cư xử khác nhau trong một bài kiểm tra đúp ngoặc hơn trong dấu ngoặc đơn.

[[$ a == z *]] # Đúng nếu $ a bắt đầu bằng dấu "z" (đối sánh mẫu).

[[$ a == "z *"]] # Đúng nếu $ a bằng z * (kết hợp theo nghĩa đen).

[$ a == z *] # Tách tệp và tách từ diễn ra.

["$ a" == "z *"] # Đúng nếu $ a bằng z * (kết hợp theo nghĩa đen).

Check-out http://tldp.org/LDP/abs/html/comparison-ops.html để biết thêm

+0

Chỉnh sửa/giải thích nhỏ: '=' và '==' thực hiện chính xác cùng một điều (tức là cả hai đều làm khớp mẫu trong '[[]]') ngoại trừ một số việc thực thi '[' không hỗ trợ '=='. Về cơ bản, lý do duy nhất để sử dụng '== 'là nó quen thuộc với các ngôn ngữ khác. Ngoài ra, '[' không hỗ trợ so sánh chuỗi với '<' and '>', bạn chỉ cần thoát khỏi chúng hoặc chúng sẽ được phân tích cú pháp như chuyển hướng I/O: '[string1 \

2

Tôi khuyên bạn nên sử dụng/esac.

case "$foo" in 
    "bar") echo "bar";; 
    *) echo "not equal";; 
esac 

Không làm phiền về cú pháp khác nhau.

3

[ là một dựng sẵn bash, [[ là một từ khóa bash. Thực hành tốt nhất là luôn sử dụng [[ nếu tập lệnh không phải tương thích với các trình bao khác (ví dụ: nếu tập lệnh bắt đầu bằng #!/bin/bash) và chỉ sử dụng [ để tương thích với trình bao Bourne. Xem http://mywiki.wooledge.org/BashFAQ/031.

Các vấn đề liên quan