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,
-eqspunebashsă interpreteze șirurile ca numere întregi (producând0fă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; fibash: [: 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 deoarece010ar 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),exprare astfel de operatori, deși va face ar Comparație ithmetică dacă argumentele sunt recunoscute ca numere (expr 01 '>=' 1returnează true,expr X01 '>=' X1returnează 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ăkshacceptată și debashșizshcu variații).
[ $UID -eq 0 ], nu[ $UID -eq 0].