Bash: double egals vs -eq

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

  • Rețineți că spațiile din paranteze sunt obligatorii: [ $UID -eq 0 ], nu [ $UID -eq 0].

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 spune bash să interpreteze șirurile ca numere întregi (producând 0 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 deoarece 010 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 de bash și zsh cu variații).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *