Kuinka käyttää vertailuoperaattoreita bashissa? [kaksoiskappale]

Tähän kysymykseen on jo annettu vastauksia :

Kommentit

Vastaus

Näitä operaattoreita käytetään esim. (( ... )) ja $(( ... )) ( aritmeettinen arviointi ja aritmeettinen laajennus ):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

Ja myös let. Seuraava vastaa ylläolevaa:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Katso Bash-käsikirjan osio ”ARITMEETTINEN ARVIOINTI”.

Vastaa

Kohdassa bash erityisesti:

  • ((arg1 >= num1)) (peritty osoitteesta ksh) tekee aritmeettisen vertailun. arg1 ja num1 viittaavat tässä samannimiseen shell-muuttujaan. Jokainen muuttuja tulkitaan aritmeettisena laajennuksena ja tulos korvataan. Täällä, jos $arg1 on 010 ja $num1 on 4+5, tulos on false (komento ((...)) palautuu nollasta poikkeavalla tilalla), koska 010 on oktaali luvulle 8 ja 4+5 on 9.
  • (($arg1 >= $num1)): sama kuin yllä, paitsi että $arg1 ja $num1 laajennetaan ennen kuin koko aritmeettinen lauseke arvioidaan. Jos $arg1 oli (2 ja $num1 oli 2), edellinen komento olisi epäonnistunut, koska (2 ja 2) eivät ole yksinään kelvollisia lausekkeita. Mutta tässä se onnistuu, koska (2 >= 2) olisi arvioitava aritmeettinen lauseke. Yleensä aritmeettisten lausekkeiden sisällä on parempi jättää $ pois. Vertaa esimerkiksi a=2+2; echo "$((3 * $a))" kohtaan a=2+2; echo "$((3 * a))".
  • let "..." (myös tiedostosta ksh). Sama kuin ((...)) paitsi, että se ”s jäsennetty tavallisena komennona, on vähemmän luettavissa, on yhtä vähän siirrettävissä ja sinun on kiinnitettävä enemmän huomiota lainaamiseen.
  • [ "$arg1" -ge "$num1" ]. Se on vakio ja kannettava. Vain desimaalivakioita tuetaan. [ 010 -ge 9 ] on sama kuin [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Myös ksh-tiedostosta, mutta suurilla eroilla. Tällä kertaa $arg1 ja $num1 otetaan huomioon aritmeettisina lausekkeina eikä vain desimaalivakioina. [[ 010 -ge 9 ]] palauttaa taas epätodellisen.
  • [[ $arg1 < $num1 ]]. Merkkijonojen vertailu. strcoll() merkkijonojen vertaamiseksi, joten käytä lajittelualgoritmia kielessä. Huomaa, että kun < ja > käytä lajittelualgoritmia, = / == vertaa tavu-tavu, joten jousipareja voi olla kaikki <, > ja = / == return false. <= ja >= ei tueta.
  • [ "$arg1" "<" "$num1" ]. Ei-standardi. Sama kuin yllä, mutta käyttämällä komentoa [. < on lainattava, joten sitä ei pidetä uudelleenohjausoperaattorina.
  • expr " $arg1" "<=" " $num1" > /dev/null (huomioi upotettu välilyönnit pakottaakseen leksikaalisen vertailun ja välttämään ongelmat merkkijonoilla, jotka näyttävät expr -operaattoreilta) tai awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" ovat vakiokomentoja merkkijonojen vertailemiseksi strcoll().

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *