Fac comparații întregi în bash (încercând să văd dacă utilizatorul rulează ca root) și am găsit două diferite modalități de a face acest lucru:
Double egals:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Înțeleg că nu există „s no> = sau < = în bash, doar -ge și -le, deci de ce există un ==
dacă există „sa -eq
?
Există o diferență în modul în care compară ambele părți?
Comentarii
Răspuns
==
este un bash
-alias specific pentru =
, care efectuează o comparație șir (lexicală) în loc de -eq
comparație numerică. (Este înapoi de la Perl: operatorii stilului cuvântului sunt numerici, cei simbolici lexicali.)
Comentarii
- Asta înseamnă că dacă ambele părți sunt numere întregi, convertește ambele părți în șiruri și apoi le compară?
- Mai precis ' este invers: totul este un șir,
-eq
spunebash
să interpreteze șirurile ca numere întregi (producând0
fără avertisment dacă un șir isn ' t numeric). - @tjameson Pentru a da un exemplu:
[ 01 -eq 1 ]
dar[ 01 != 1 ]
. - Rețineți că, în timp ce
==
ca operator[
nu este standard și ar trebui nu trebuie utilizat, nu este specific bash . A fost introdus de ksh și este, de asemenea, acceptat de zsh (deși primul=
trebuie citat) , yash și utilitarul GNU[
și orice astfel de utilități implementate ca scripturi ksh pe unele sisteme) cel puțin). - @geekosaur Primesc un avertisment de la bash v4.3.42 dacă șirul meu nu este ' t numeric:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: expresie întreagă așteptată
Răspuns
Pentru a elabora răspunsul bollovan …
Nu există >=
sau <=
operator de comparație pentru șiruri. Dar le-ați putea folosi cu comanda aritmetică ((...))
pentru a compara numere întregi.
Puteți utiliza și ceilalți operatori de comparație a șirurilor (==
, !=
, <
, >
, dar nu =
) pentru a compara numere întregi dacă le utilizați în ((...))
.
Exemple
- Atât
[[ 01 -eq 1 ]]
, cât și(( 01 == 1 ))
fac un număr întreg comparații. Ambele sunt adevărate. - Ambele
[[ 01 == 1 ]]
și[ 01 = 1 ]
fac comparații de șiruri. Ambele sunt false. - Ambele
(( 01 -eq 1 ))
și(( 01 = 1 ))
vor afișa o eroare.
Notă: sintaxa cu paranteze dublă [[...]]
și sintaxa cu paranteze duble ((...))
nu sunt acceptate de toate shell-urile.
Comentarii
- Rețineți că (cu excepția
mksh
/zsh
în modul POSIX (deși ' nu este o funcție POSIX))),(( 010 == 10 ))
va reveni fals deoarece010
ar fi tratat ca un număr octal (8 în zecimal). - Rețineți că, în timp ce majoritatea
test
/[
implementările nu ' nu au>=
/<=
operatori (yash
' s[
are totuși),expr
are astfel de operatori, deși va face ar Comparație ithmetică dacă argumentele sunt recunoscute ca numere (expr 01 '>=' 1
returnează true,expr X01 '>=' X1
returnează false).
Răspuns
Dacă doriți să faceți comparații întregi, veți folosi mai bine (()), unde puteți utiliza și> = etc.
Exemplu:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Comentarii
- Sau
(( UID == 0 ))
sau(( ! UID ))
pentru asta contează. Rețineți că((...))
nu este standard (o caracteristicăksh
acceptată și debash
șizsh
cu variații).
[ $UID -eq 0 ]
, nu[ $UID -eq 0]
.