Toán tử so sánh và biểu thức Bash


11

Tôi mới tham gia lập trình bash. Tôi đã đọc hai hướng dẫn dài, tốt, nhưng chúng làm tôi bối rối về các toán tử và từ khóa.

Mà phổ biến hơn và được sử dụng rộng rãi? Tôi không biết khi nào nên sử dụng cái nào và tại sao.

  1. test, [[ ]]Hoặc [ ]hoặc thậm chí(( ))
  2. $((exp)) hoặc là $[exp]
  3. -gthoặc >, gehoặc >=vv
  4. khi nào nên sử dụng <>hoặc ( )khi nào chúng ta phải thoát khỏi nó, \: \< \(v.v.
  5. ==hoặc =(so sánh chuỗi)

Tôi biết sự khác biệt cơ bản giữa [[[nhưng những câu hỏi khác là một bí ẩn đối với tôi.

Cảm ơn bạn trước


2
Một wiki rất hữu ích được cập nhật và đề cập đến nhiều thực tiễn tốt là wiki của Greg . Hướng dẫn Bash và FAQ trên đó đặc biệt hữu ích.

Câu trả lời:


5
  • testlà một vỏ được tích hợp sẵn (rõ ràng) kiểm tra một số điều kiện nhất định. Một số shell cũ cần một lệnh đặc biệt. Vì vậy, bạn cũng sẽ tìm thấy một chương trình tại /usr/bin/test.
  • [cũng là một chương trình để kiểm tra một số điều kiện. Phần mềm này cũng cần một khung đóng và bạn có thể tìm thấy nó tại /usr/bin/[.
  • [[…]]là một thay thế cho test[. Nó được phát triển cho vỏ Korn ( ksh). Nhưng bạn cũng tìm thấy nó trong các phiên bản Bash lớn hơn 2 và trong Z Shell. Dấu ngoặc kép có một số tính năng tiện lợi:
    • Shell không tách từ hoặc mở rộng tên tệp.
    • Bạn không cần trích dẫn.
    • Thay vì -a(AND) hoặc -o(OR), bạn có thể sử dụng &&hoặc ||.
    • =thể làm nhiều hơn nữa.
  • ((…))tương đương với let. Vì vậy, về cơ bản ((expression))là giống như let "expression". Tuy nhiên với letbạn có thể sử dụng nhiều hơn một biểu thức, nhưng dấu ngoặc kép chỉ cho phép một biểu thức.
  • $((…))(và cũng $[…]) làm một số tính toán. Bạn shell cố gắng tính toán biểu thức bên trong dấu ngoặc nhọn và thay thế biểu thức bằng kết quả. Vì vậy, echo $((1+1))dẫn đến echo 2. Vì vậy, vỏ của bạn in số 2.

Mỗi khi bạn muốn so sánh hai số, bạn nên sử dụng tùy chọn với dấu gạch ngang và hai chữ cái ( -ge, -ltv.v.). Nếu bạn muốn so sánh chuỗi bạn nên sử dụng =hoặc !=.

Câu hỏi của bạn liên quan đến việc trốn thoát là khá khó để trả lời. Bởi vì nó phụ thuộc vào phần mềm bạn sử dụng bên cạnh vỏ. Vì vậy, tức là grepgrep -Ecần thoát khác nhau. Đây cũng là trường hợp với sed, awkvà những người khác. Vì vậy, lựa chọn tốt nhất là có một cái nhìn vào trang web. Sau một thời gian bạn quen và biết khi nào nên sử dụng thoát.


cảm ơn bạn. thêm một câu hỏi - bởi vì có thể thực hiện so sánh bằng cách sử dụng ((...)) - có phổ biến hơn khi sử dụng phiên bản này: if ((2> 1)) HOẶC điều này: if [[2 -gt 1]]
MikeD

Tôi cho rằng điều đó if [ 2 -gt 1 ]; …là phổ biến hơn, bởi vì tôi thấy điều này thường xuyên hơn trong các kịch bản shell và theo như tôi biết thì đây là tuân thủ POSIX.
qbi

Một điều khác cần ghi nhớ là [biểu thức] là đúng nếu biểu thức ước lượng thành / trả về 0, nhưng ((biểu thức)) là đúng nếu biểu thức ước lượng thành / trả về khác không.
Joe
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.