it-swarm-vi.com

Bash: nhân đôi so với -eq

Tôi đang thực hiện so sánh số nguyên trong bash (cố gắng xem người dùng có đang chạy bằng root không) và tôi đã tìm thấy hai cách khác nhau để làm điều đó:

Nhân đôi:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

Tôi hiểu rằng không có> = hoặc <= trong bash, chỉ -ge và -le, vậy tại sao lại có == nếu có -eq?

Có một sự khác biệt trong cách so sánh cả hai bên?

49
beatgammit

== là một bí danh cụ thể bash- cho =, thực hiện so sánh chuỗi (từ vựng) thay vì -eq so sánh số. (Nó ngược từ Perl: các toán tử kiểu Word là số, các toán tử tượng trưng theo từ vựng.)

55
geekosaur

Để giải thích về câu trả lời của bollovan ...

Không có toán tử so sánh >= Hoặc <= Cho chuỗi. Nhưng bạn có thể sử dụng chúng với lệnh số học ((...)) Để so sánh các số nguyên.

Bạn cũng có thể sử dụng các toán tử so sánh chuỗi khác (==, !=, <, >, Nhưng không phải =) Để so sánh các số nguyên nếu bạn sử dụng chúng bên trong ((...)).

Ví dụ

  • Cả [[ 01 -eq 1 ]](( 01 == 1 )) Đều so sánh số nguyên. Cả hai đều đúng.
  • Cả [[ 01 == 1 ]][ 01 = 1 ] Đều so sánh chuỗi. Cả hai đều sai.
  • Cả (( 01 -eq 1 ))(( 01 = 1 )) Sẽ trả về lỗi.

Lưu ý: Cú pháp ngoặc kép [[...]] Và cú pháp dấu ngoặc kép ((...)) Không được hỗ trợ bởi tất cả các shell.

13
toxalot

Nếu bạn muốn thực hiện so sánh số nguyên, bạn sẽ sử dụng (()) tốt hơn, nơi bạn cũng có thể sử dụng> = vv.

Thí dụ:

if (( $UID == 0 )); then
   echo "You are root"
else
   echo "You are not root"
fi
7
bollovan