it-swarm-id.com

Bash: dobel sama dengan -eq

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?

49
beatgammit

== adalah bash- alias khusus untuk =, yang melakukan perbandingan string (leksikal) alih-alih -eq perbandingan numerik. (Ini mundur dari Perl: operator gaya Word adalah numerik, yang simbolik leksikal.)

55
geekosaur

Untuk 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 di dalam ((...)).

Contoh

  • Keduanya [[ 01 -eq 1 ]] dan (( 01 == 1 )) melakukan perbandingan integer. Keduanya benar.
  • Keduanya [[ 01 == 1 ]] dan [ 01 = 1 ] melakukan perbandingan string. Keduanya salah.
  • Keduanya (( 01 -eq 1 )) dan (( 01 = 1 )) akan mengembalikan kesalahan.

Catatan: Sintaks braket ganda [[...]] dan sintaks tanda kurung ganda ((...)) tidak didukung oleh semua shell.

13
toxalot

Jika Anda ingin melakukan perbandingan integer Anda akan lebih baik menggunakan (()), di mana Anda juga dapat menggunakan> = dll.

Contoh:

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