Bash: çift eşittir vs -eq


47

Bash cinsinden tamsayı karşılaştırması yapıyorum (kullanıcının root olarak çalışıp çalışmadığını görmeye çalışıyorum) ve bunu yapmanın iki farklı yolunu buldum:

Çifte eşittir:

if [ $UID == 0 ]
then
fi

-eq

if [ $UID -eq 0 ]
then
fi

Ben bash, sadece -ge ve -le'de>> veya <= olmadığını anlıyorum, öyleyse neden bir ==varsa -eq?

İki tarafı karşılaştırması açısından bir fark var mı?


3
Parantez içindeki alanlarda gerekli dikkat ediniz: [ $UID -eq 0 ]değil [ $UID -eq 0].
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


50

==a, bashiçin özgü takma =yerine bir dizisi (sözcük) karşılaştırma yapar, -eqSayısal karşılaştırma. (Perl'den geriye doğru: kelime tarzı operatörler sayısal, sembolik olanlar söz konusudur).


Bu, her iki tarafın da tamsayı olması durumunda, her iki tarafın da dizgilere dönüştürülmesi ve sonra bunları karşılaştırması anlamına mı geliyor?
beatgammit

5
Daha doğrusu, tam tersi bir yoldur: her şey bir dizedir, dizeleri tamsayılar olarak yorumlamayı -eqsöyler bash( 0bir dize sayısal değilse uyarı olmadan üretilir ).
geekosaur

11
@tjameson Bir örnek vermek gerekirse: [ 01 -eq 1 ]ama [ 01 != 1 ].
Gilles 'SO- kötü olmayı bırak'

3
Not ederken o ==bir şekilde [operatör standart dışı ve kullanılmamalıdır, değil mi bash özgü . Ksh tarafından tanıtıldı ve aynı zamanda zsh (ilk =önce alıntılanması gerekiyorsa da), yash ve GNU [programı (ve bazı sistemlerde ksh betiği olarak uygulanan herhangi bir yardımcı program) en azından destekleniyor.
Stéphane Chazelas 15:15 te

@geekosaur Eğer dizem sayısal değilse bash v4.3.42'den bir uyarı alıyorum: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: merhaba: tamsayı ifadesi bekleniyor
Andrew Bainbridge

13

Bollovan'ın cevabını detaylandırmak için ...

Hiçbir yoktur >=ya <=dizeleri karşılaştırma operatörü. Fakat ((...))tamsayıları karşılaştırmak için onları aritmetik komutla kullanabilirsiniz.

Ayrıca (diğer dize karşılaştırma operatörleri kullanabilirsiniz ==, !=, <, >, ama =içeri bunları kullanmak ise) tamsayılar karşılaştırmak ((...)).

Örnekler

  • Her ikisi de [[ 01 -eq 1 ]]ve (( 01 == 1 ))tamsayı karşılaştırmalar yapmak. Her ikisi de doğru.
  • Her ikisi de [[ 01 == 1 ]]ve [ 01 = 1 ]dize karşılaştırmalar yapmak. Her ikisi de yanlıştır.
  • Hem (( 01 -eq 1 ))ve (( 01 = 1 ))bir hata döndürür.

Not: İkili ayraç sözdizimi [[...]]ve çift parantez sözdizimi ((...))tüm kabuklar tarafından desteklenmez.


1
Not ki (haricinde mksh/ ' zsh((POSIX modu dışında bir POSIX özelliği olmasa da))), (( 010 == 10 ))yanlış çünkü dönecekti 010sekizlik bir sayı (ondalık 8) olarak ele alınır.
Stéphane Chazelas,

Çoğu test/ [uygulamanın >=/ <=operatöre sahip olmamasına rağmen ( yash's [' olsa da), exprbu tür operatörlere sahip olduğuna rağmen, argümanlar sayı olarak kabul edilirse aritmetik karşılaştırma yapar ( expr 01 '>=' 1doğru, expr X01 '>=' X1yanlış döndürür).
Stéphane Chazelas

7

Tamsayı karşılaştırması yapmak istiyorsanız, daha iyi kullanmanız gerekir (()), burada> = etc kullanabilirsiniz.

Örnek:

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

Ya (( UID == 0 ))ya (( ! UID ))o konularda. Not ((...))standart olmayan (a, kshtarafından da desteklenen bir özellik bashve zshçeşitleri).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.