Saya melakukan perbandingan integer di bash (mencoba melihat apakah pengguna berjalan sebagai root), dan saya menemukan dua cara berbeda untuk melakukannya:
Ganda sama dengan:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Saya mengerti bahwa tidak ada> = atau <= dalam bash, hanya -ge dan -le, jadi mengapa ada ==
jika ada -eq
?
Apakah ada perbedaan dalam cara membandingkan kedua belah pihak?
bash
shell
arithmetic
hajar
sumber
sumber
[ $UID -eq 0 ]
tidak[ $UID -eq 0]
.Jawaban:
==
adalahbash
alias khusus untuk=
, yang melakukan perbandingan string (leksikal) alih-alih-eq
perbandingan numerik. (Ini mundur dari Perl: operator gaya kata adalah numerik, yang simbolik leksikal.)sumber
-eq
mengatakanbash
untuk menafsirkan string sebagai bilangan bulat (memproduksi0
tanpa peringatan jika string tidak numerik).[ 01 -eq 1 ]
tetapi[ 01 != 1 ]
.==
sebagai[
operator adalah non-standar dan tidak boleh digunakan, itu tidak spesifik untuk bash . Ini diperkenalkan oleh ksh dan juga didukung oleh zsh (meskipun yang pertama=
perlu dikutip), yash dan[
utilitas GNU (dan semua utilitas tersebut diimplementasikan sebagai skrip ksh pada beberapa sistem) setidaknya).$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: ekspresi integer diharapkanUntuk menguraikan jawaban bollovan ...
Tidak ada
>=
atau<=
operator perbandingan untuk string. Tapi Anda bisa menggunakannya dengan((...))
perintah aritmatika untuk membandingkan bilangan bulat.Anda juga dapat menggunakan operator perbandingan string lainnya (
==
,!=
,<
,>
, tapi tidak=
) untuk membandingkan bilangan bulat jika Anda menggunakannya dalam((...))
.Contohnya
[[ 01 -eq 1 ]]
dan(( 01 == 1 ))
melakukan perbandingan integer. Keduanya benar.[[ 01 == 1 ]]
dan[ 01 = 1 ]
melakukan perbandingan string. Keduanya salah.(( 01 -eq 1 ))
dan(( 01 = 1 ))
akan mengembalikan kesalahan.Catatan: Sintaks braket ganda
[[...]]
dan sintaks kurung ganda((...))
tidak didukung oleh semua shell.sumber
mksh
/zsh
(kecuali dalam mode POSIX (meskipun itu bukan fitur POSIX)))),(( 010 == 10 ))
akan kembali salah karena010
akan diperlakukan sebagai angka oktal (8 dalam desimal).test
/[
implementasi tidak memiliki>=
/<=
operator (yash
's[
memiliki meskipun),expr
memiliki operator tersebut, meskipun ia akan melakukan perbandingan aritmatika jika argumen diakui sebagai nomor (expr 01 '>=' 1
kembali benar,expr X01 '>=' X1
kembali false).Jika Anda ingin melakukan perbandingan integer Anda akan lebih baik menggunakan (()), di mana Anda juga dapat menggunakan> = dll.
Contoh:
sumber
(( UID == 0 ))
atau(( ! UID ))
untuk hal itu. Catatan yang((...))
tidak standar (ksh
fitur juga didukung olehbash
danzsh
dengan variasi).