Poređenje varijable Bash stringova. Poređenje stringova bez obzira na velika i mala slova u Bashu

Uvjet if-else se primjenjuje u BASH skripte Često. Sam uslov ima pomalo čudan oblik [[ stanje ]]. Obratite pažnju na uvlake. Bez njih, stanje neće funkcionirati. Dajem listu logičkih operatora za uslov [[ ? ]]:

Lista logičkih operatora koji
koristi se za konstrukciju if-then-else-fi

#!/bin/bash ako [[ $1 > 2 ]] zatim # ako [[ ? ]] echo $1" veće od 2" else # ako nije tačno echo $1" manje od 2 ili 2" fi

Nekima od vas će biti čudan operator jednakosti -eq. Pokušajte koristiti poznate operatore >

Recimo da imate skriptu i potrebna je verifikacija korisnika. Ako korisnik nije root, skripta će se zaustaviti.

#!/bin/bash if [ "$(whoami)" != "root" ]; zatim echo "Nemate dozvolu za pokretanje $0." izlaz1; fi

Često morate provjeriti vrijednost varijable. Ako u varijabli nema ništa, onda možete zaustaviti skriptu.

#!/bin/bash if [ -n "$num" ]; onda "varijabla ima nešto i možete pokrenuti drugi proces" inače echo "prazna varijabla, zaustavite skriptu" izlaz 0; fi

Ako je varijabla prazna, onda se može popuniti.

#!/bin/bash if [ -z "$num" ]; onda echo "varijabla je prazna" num=1 else echo "num="$num fi

Prazna varijabla se može dodijeliti zadana vrijednost. Ovaj unos je kraći nego u prethodnom primjeru.

#!/bin/bash # Upišite DEFAULT if argumente komandna linija nedostaje [ -z "$arg1" ] && arg1=DEFAULT echo $arg1

Ova tema je četvrta tema u nizu jezika bash shell. On će govoriti o takvim kontrolnim strukturama jezika kao uslovnim iskazima. Ali prije nego što pređemo na njihov opis, potrebno je zadržati se na nekim nijansama koje će razmatranje materijala u nastavku učiniti razumljivijim.
Prvo, pogledajmo šta je lista komandi. Lista naredbi je jedna naredba, cjevovod ili niz naredbi/provoda razdvojenih jednim od sljedećih operatora: ";", "&&", "||", koji se završava tačkom i zarezom.
; - operator uzastopnog izvršavanja više naredbi. Svaka naredna naredba počinje da se izvršava tek nakon završetka prethodne (bilo uspješne ili ne);
&& - operator izvršenja naredbe samo nakon uspješnog izvršenja prethodne;
|| - naredba za izvršavanje naredbe samo nakon pogrešnog izvršenja prethodne.
Kôd uspjeha je 0, a kod greške nije nula (ovisno o vrsti greške). Ne treba ih brkati sa uobičajenim programskim jezicima kada je 1 tačno, a 0 netačno.
Sada možemo preći na direktno razmatranje uslovnih iskaza.

operator varijante slučaja

Opća sintaksa iskaza case je:

vrijednost slučaja u
šablon1) lista1;;
obrazac2 | šablon3) lista2;;
esac

Logički slijed izvršavanja naredbe case:
a) traži se prvi obrazac koji odgovara vrijednosti;
b) ako se pronađe, izvršava se lista komandi koje joj odgovaraju, a završava se sa ";;";
c) kontrola se prenosi na operatere nakon izgradnje kućišta.
Uzorak i lista su odvojeni znakom ")". Nekoliko uslova može odgovarati jednoj listi naredbi, u kom slučaju se moraju odvojiti simbolom "|".
U predlošcima možete koristiti znakove "*", "?", "", koji su opisani u drugoj temi ciklusa. Uz njihovu pomoć, možete implementirati instrukciju koja djeluje kao zadano u naredbi switch jezika kao što su C, PHP.
Navest ću primjer korištenja padeža:
echo -n "[Univerzalni preglednik] Odredite naziv datoteke: "; pročitajte veličinu datoteke "$File" u *.jpg|*.gif|*.png) eog $File ;; *.pdf) evince $File ;; *.txt) manje $File ;; *.html) firefox $File ;; /dev/*) echo "Pa, to su strašni fajlovi." ;; *) echo "Ok, ok - nije tako svestran." echo "Nisam upoznat sa ovom vrstom datoteke. Ne znam kako da je vidim." ;; esac
Još jedan primjer korištenja case konstrukcije:
echo "Greška. Kome da pošaljem poruku?" echo "Šefici: b" echo "Kolegama: c" echo "Nikome: bilo koji ključ" pročitaj slučaj odgovora $answer u b|B) mail –s "Evidencija grešaka" šef< error.log;; c|C) mail –s "Help! error log" –c denis nick < error.log;; *) echo "error"; exit;; esac

Uslovna if izjava

Opća sintaksa if naredbe je:

ako list1 onda
lista2

fi

Uglaste zagrade ovdje označavaju neobavezne konstrukcije. Logički slijed izvršavanja naredbe case:
a) lista1 se izvršava;
b) ako se izvršava bez grešaka, izvršava se lista2. U suprotnom se izvršava lista3, a ako se završi bez greške, list4. Ako list3 također vraća kod greške, list5 se izvršava;
c) kontrola se prenosi na operatere nakon konstrukcije if.
Navest ću primjer korištenja if:
if grep -q Bash datoteka onda echo "Datoteka sadrži barem jednu Bash riječ." fi
Kada se if i then nalaze na istoj liniji, tada konstrukcije if i then moraju završiti tačkom i zarezom. Na primjer:
$if[ $? –ne0]; zatim echo "Greška"; fi
Sada, znajući da je moguće staviti if i zatim u isti red, prepišimo gornji primjer:
ako grep -q Bash datoteka; zatim echo "Datoteka sadrži riječ Bash." fi

test iskaz i uslovni izrazi

U gornjem primjeru, umjesto raščlanjivanja izlaznog koda, koristi se provjera stanja. Dva oblika takvog testa su ekvivalentna: test ugrađena komanda i [uslov]. Na primjer, da biste provjerili postoji li datoteka, napisali biste:
test -e<файл>
ili
[-e<файл> ]
Ako se koriste uglaste zagrade, one moraju biti odvojene jedna od druge razmakom, jer je "[" ime naredbe, a "]" je potreban posljednji argument za njen završetak.
Ako je uvjet uspješno provjeren, vraća se 0, a ako je netačan, kod greške je 1.
Test komanda može provjeriti da li je string prazan. Neprazan niz rezultira izlaznim kodom 0. Prazan, odnosno - 1. Na primjer:
$ test $USER; echo $? 0
Konstrukcija "" je svestranija od "". Ova proširena verzija test komande. Unutar ove konstrukcije se ne vrši dodatna interpretacija imena datoteka i ne vrši se dijeljenje argumenata u zasebne riječi, ali je zamjena parametara i naredbi dozvoljena. Na primjer:
file=/etc/passwd ako [[ -e $file ]] zatim echo “Pronađena datoteka lozinke.” fi
Konstrukcija "" je poželjnija od "" jer će pomoći da se izbjegnu neke logičke greške. Na primjer, operatori "&&", "||", "<" и ">" unutar "" su savršeno valjane, dok unutar "" generiraju poruke o grešci.
Konstrukcija "(())" omogućava izračunavanje aritmetičkih izraza unutar nje. Ako je rezultat izračuna nula, vraća se kod greške. Rezultat izračunavanja različit od nule daje povratni kod od 0. To jest, potpuno suprotno od testa i "" instrukcija o kojima smo gore govorili.
Naredba if dozvoljava ugniježđene provjere:
if echo "Sljedeće *if* je unutar prvog *if*." ako [[ $comparison = "integer" ]] onda ((a< b)) else [[ $a < $b ]] fi then echo "$a меньше $b" fi

Uslovni izrazi se mogu kombinovati pomoću uobičajenih logičkih operacija:
! <выражение>- poricanje;
<выражение1>-a<выражение2>- logičko I;
<выражение1>–o<выражение2>- logičko ILI.

Elementarni uvjetni izrazi za datoteke:
-e - datoteka postoji;
-f - obična datoteka (ne direktorij ili datoteka uređaja);
-s - veličina datoteke koja nije nula;
-d - datoteka je direktorij;
-b - datoteka je blok uređaj (floppy, cdrom, itd.);
-c - datoteka je karakterni uređaj (tastatura, modem, zvučna kartica i tako dalje.);
-p - fajl je cev;
-h - datoteka je simbolička veza;
-L - datoteka je simbolička veza;
-S - fajl je socket;
-t - datoteka je povezana sa terminalnim uređajem;
-r - datoteka je čitljiva (korisniku koji je pokrenuo skriptu);
-w - u datoteku se može pisati (korisniku koji je pokrenuo skriptu);
-x - datoteka je dostupna za izvršenje (korisniku koji je pokrenuo skriptu);
-g - (sgid) zastavica za datoteku ili direktorij je postavljena;
-u - (suid) postavljena je zastavica za datoteku;
-k - postavljena je zastavica ljepljivog bita;
-O - ​​vi ste vlasnik fajla;
-G - pripadate istoj grupi kao i fajl;
-N - datoteka je izmijenjena od posljednjeg čitanja;
fajl1 -nt fajl2 – fajl1 je noviji od fajla2;
file1 -ot file2 – fajl1 je stariji od fajla2;
file1 -ef file2 - file1 i file2 su čvrste veze ka istom fajlu.

Elementarni uvjetni izrazi za poređenje nizova:
-z string – dužina niza je 0;
-n string – dužina stringa nije jednaka 0;
string1 == string2 – nizovi se podudaraju (slično kao “=”);
red1 !== red2 – redovi se ne podudaraju (slično kao “!=”);
linija1< строка2 – строка1 предшествует строке2 в лексикографическом порядке;
red1 > red2 - red1 prati red2 u leksikografskom redu.
Aritmetički uslovni izraz ima format:
argument1 operacija argument2 gdje su argumenti cijeli brojevi i sljedeće operacije su dozvoljene:
-eq - jednako;
-ne - nije jednako;
-lt - manje;
-le - manje ili jednako;
-gt - više;
-ge - veće ili jednako;
< - меньше (внутри двойных круглых скобок);
<= - меньше или равно (внутри двойных круглых скобок);
> - veće od (unutar dvostrukih zagrada);
>= - veće ili jednako (unutar dvostrukih zagrada).

Prepišimo prethodni primjer koristeći if naredbu:
echo "Greška. Kome da pošaljem poruku?" echo "Šefici: b" echo "Kolegama: c" echo "Nikome: bilo koji ključ" pročitaj odgovor ako [ "$answer" == "b" –o "$answer" == "B" ]; zatim mail –s šef "logo grešaka".< error.log; elif [ "$answer" == "c" –o "$answer" == "C" ]; then mail –s "Help! error log" –c denis nick < error.log; else echo "error"; exit; fi

U sljedećoj temi nastavit ću razmatrati kontrolne strukture bash shell-a. Naime, razmatrat će se operatori petlje. A sad cekam komentare i kritike :).

UPD: Hvala korisniku

Poređenje stringova u Bashu ne uzrokuje nikakve probleme sve dok se ne pojavi zadatak da uporedite dva niza na način bez obzira na velika i mala slova. Dat ću nekoliko opcija za rješavanje problema koje sam koristim. Karakteristika ovih rješenja je korištenje samo ugrađenih funkcija Bash shell-a.

Prvo ću kreirati dvije varijable str1 i str2 koje sadrže nizove koje treba uporediti. Oni će se koristiti u sljedećim primjerima koda.

#!/bin/bash str1 = "String za poređenje" str2 = "string za poređenje"

Prva verzija poređenja stringova bez obzira na velika i mala slova koju želim da predložim koristi kontrolu opcija ljuske sa ugrađenom komandom shopt.

shopt -s nocasematch [[ $str1 == $str2 ]] && echo "podudaranje" || echo "ne odgovara" shopt -u nocasematch

Sljedeća verzija poređenja stringova bez osjetljivosti na velika i mala slova bazirana je na principu samostalnog pretvaranja nizova u uobičajeni slučaj. Ova varijanta koda radi na Bash verziji 4 i novijim. Ako ga koristite na ranijoj verziji Bash-a, dovest će do greške.

Dakle, da biste uporedili nizove prebačene u mala slova, možete koristiti sljedeći kod.

[[ " $( str1 , ) " == " $( str2 , ) " ]] && echo "podudaranje" || echo "ne odgovara"

Ako želite da konvertujete upoređene nizove u velika slova, možete koristiti sledeći kod.

[[ " $( str1 ^^ ) " == " $( str2 ^^ ) " ]] && echo "podudaranje" || echo "ne odgovara"

Alternativno, nizovi se mogu prisiliti u vrijeme deklaracije varijable. Ovo se radi pomoću naredbe declare shell ugrađene.

Da biste deklarirali varijablu koja sadrži tekst malim slovima, koristite sljedeći kod.

#!/bin/bash declare -l str = "Camel Case String"

Kao rezultat izvršavanja ovog koda, varijabla str će sadržavati niz malih slova, uprkos činjenici da je string koji se dodjeljuje napisan u velikom slovu. Možete promijeniti velika i mala slova stringa koji je već postavljen u varijablu na sljedeći način.

#!/bin/bash str = "Camel Case String" deklarirati -l str str = $str echo $str

Da biste string pretvorili u velika slova, u gornjem primjeru koda, trebali biste promijeniti poziv u naredbu declare, koristeći prekidač -u umjesto prekidača -l.

Sada se poređenje stringova bez obzira na velika i mala slova pomoću naredbe declare može uraditi na sljedeći način.

declare -l str1_l = $str1 declare -l str2_l = $str2 [[ $str1_l == $str2_l ]] && echo "podudaranje" || echo "ne odgovara"

Bilo koje od ovih poređenja stringova bez obzira na velika i mala slova može se koristiti u Bash skriptiranju. Stoga, ako koristite Bash verziju 4 i noviju, možete odabrati onu koja vam se najviše sviđa. Ako je Bash verzija manja od 4, tada treba koristiti prvu opciju, specificirajući opciju nocasematch koristeći ugrađenu ljusku shopt-a.

Prilikom pisanja skripti u Bashu, ne samo iskusni programeri, već i novopridošlice u Bash shell-u se suočavaju sa radom sa stringovima. Ovo je najčešće potrebno prilikom čitanja naredbi koje je korisnik unio kao argumente izvršnoj skripti, kao i prilikom obrade tekstualne datoteke. A jedan od potrebnih trikova u ovom slučaju je poređenje nizova.

Ovaj članak će se baviti poređenjem Bash stringova, kao i nekim nijansama korištenja operacija poređenja i rješavanja uobičajenih grešaka.

Ove operacije vam omogućavaju da utvrdite da li su upoređeni nizovi isti:

  • = - jednake, na primjer ako [ "$x" = "$y" ]
  • == - sinonim za operator "=", na primjer ako [ "$x" == "$y" ]
  • != - nije isto, na primjer ako [ "$x" != "$y" ]

#!/bin/bash
testuser=anton
ako [ $USER = $testuser ]
onda
echo "Dobrodošao $testuser"
fi

Rezultat skripte:

Prilikom provjere jednakosti sa naredbom test(sinonim uglaste zagrade) svi znaci interpunkcije i razlike u slučaju slova upoređenih nizova se uzimaju u obzir.

Neke karakteristike uparivanja nizova sa uzorcima:

# vraća true ako niz sadržan u $x počinje sa "y"
[[ $x == y* ]]
# vraća true ako je niz od $x tačno dva znaka "y*"
[[ $x == "y*" ]]
# vraća true ako $x sadrži ime datoteke sadržane u trenutnom direktoriju koji počinje s "y"
[ $x == y* ]
# vraća true ako je niz $x jednak dvama karakterima "y*"
[ "$x" == "y*" ]

Na primjer, provjera bash niza da se vidi da li počinje sa y:

#!/bin/bash
x=yandex
[[ $x == y* ]]
echo $?

Rezultat izvršenja koda:

Skripta daje 0 (nula) jer smo tražili kod greške posljednje izvršene instrukcije. Kôd 0 znači da je skripta pokrenuta bez grešaka. Zaista, varijabla $x sadrži string yandex, koji počinje znakom "y". U suprotnom, može biti napisano "1". Ovo je prilično zgodan način za otklanjanje grešaka u skriptama.

Poređenje stringova po abecednom redu u Bashu

Zadatak postaje složeniji kada se pokušava utvrditi da li je niz prethodnik drugog niza u rastućem redoslijedu sortiranja. Ljudi koji pišu skripte u bash ljusci često nailaze na dva problema u vezi sa operacijama veće od i manje od upoređivanja Linux nizova, koji imaju prilično jednostavna rješenja:

Prvo, znakovi "veće od" i "manje od" moraju se izbjeći dodavanjem obrnute kose crte (\) ispred njih, jer će ih u suprotnom shell tretirati kao znakovi za preusmjeravanje, a nizovi kao nazivi datoteka. Ovo je jedan od onih slučajeva u kojima je pronalaženje greške prilično teško.

#!/bin/bash
# pogrešna upotreba operatora poređenja nizova
val1=bejzbol
val2=hokej
ako [ $val1 > $val2 ]
onda

ostalo

fi

Šta se dešava ako uporedite bash stringove:

Kao što vidite, sam simbol "veće od", u svom direktnom obliku, dao je pogrešne rezultate, iako nisu generisane greške. U ovom slučaju, ovaj znak je uzrokovao preusmjeravanje izlaznog toka, tako da nisu pronađene sintaksičke greške i, kao rezultat, datoteka pod nazivom hokej:

Da biste popravili ovu grešku, morate izbjeći znak ">" tako da uvjet izgleda ovako:

...
ako [ $val1 \> $val2 ]
...

Tada će rezultat programa biti tačan:

Drugo, nizovi poredani koristeći operatore "veće od" i "manje od" raspoređeni su drugačije nego što je to slučaj s komandom sortiraj. Ovdje je probleme teže prepoznati i možda se uopće neće naići ako je poređenje neosjetljivo na velika i mala slova. U timu sortiraj I test Poređenje je drugačije:

#!/bin/bash
val1=Testiranje
val2=testiranje
ako [ $val1 \> $val2 ]
onda
echo "$val1 je veći od $val2"
ostalo
echo "$val1 je manji od $val2"
fi

Rezultat koda:

U timu test stringovi velikih slova će prvo prethoditi nizovima malih slova. Ali ako su isti podaci upisani u datoteku, na koju onda primijeniti naredbu sortiraj, tada će nizovi s malim slovima biti prvi:

Razlika između njihovog rada je u tome test za određivanje redosleda sortiranja, kao osnova se uzima raspored znakova prema ASCII tabeli. IN sortiraj također koristi redoslijed sortiranja specificiran za regionalne postavke jezika.

Provjera niza za praznu vrijednost

Poređenje pomoću operatora -z I -n koristi se za određivanje sadrži li varijabla sadržaj. Na ovaj način možete pronaći prazne linije u bash-u. primjer:

#!/bin/bash
val1=testiranje
val2=""
# provjerava da li je string prazan
ako [ -n $val1 ]
onda
echo "Niz "$val1" nije prazan"
ostalo
echo "String "$val1" je prazan"
fi
# provjerava da li je string prazan
ako [ -z $val2 ]
onda
echo "String "$val2" je prazan"
ostalo
echo "Niz "$val2" nije prazan"
fi
ako [ -z $val3 ]
onda
echo "String "$val3" je prazan"
ostalo
echo "Niz "$val3" nije prazan"
fi

Rezultat koda:

Ovaj primjer kreira dvije varijable niza - val1 I val2. Operacija -n određuje da li varijabla ima val1 dužina različita od nule, i -z provjere val2 I val3 na nulu. Važno je napomenuti da potonji nije definisan do trenutka poređenja, ali tumač smatra da je njegova dužina i dalje jednaka nuli. Ovu nijansu treba uzeti u obzir u različitim provjerama scenarija. I, ako niste sigurni koja je vrijednost sadržana u varijabli i da li je uopće postavljena, trebali biste to provjeriti pomoću operatora -n ili -z i tek onda ga koristiti za predviđenu svrhu.

Vrijedi obratiti pažnju na funkciju -n. Ako se nedeklarirana ili prazna varijabla proslijeđuje na testiranje, ona će vratiti true, a ne false. U takvim slučajevima, string (varijabla) koji se provjerava treba staviti u dvostruke navodnike tako da izgleda ovako:

...
ako [ -n "$val1" ]
...

zaključci

Postoje određene nijanse u Bash operacijama poređenja stringova koje je vrijedno razumjeti kako bi se spriječile greške u skriptiranju. Ali takvih situacija u praksi ima mnogo, pa zapamtiti sve (a još više opisati) neće uspjeti.

U Bash shell skriptama možemo izvršiti poređenja brojeva. Da biste izvršili operaciju poređenja brojeva u Bashu, morate koristiti stanje "test" unutar if ili petlje. U ovom postu ćemo vam reći kako da uporedite brojeve u bash-u.

Operatori za poređenje bash brojeva

operateršta on radiprimjer
-equporedi cifre u bash-u radi jednakosti, vraća 0 ako je jednakoako [ $a -eq $b ] onda
-gepoređenje brojeva u bash ako su veći ili jednaki. Rezultat vraća 0 ako je veći ili jednakako [ $a -ge $b ] onda
-gtuspoređuje brojeve u bash ako su veći od.ako [ $a -gt $b ] onda
-leuspoređuje brojeve u bash ako su manji ili jednaki.if [ $a -le $b ] onda
-ltupoređuje brojeve u bash ako je manje.ako [ $a -lt $b ] onda
-neupoređuje brojeve u bash-u ako nisu jednaki ili ne.if [ $a -ne $b ] onda

Detaljni primjeri operatora poređenja brojeva u Bashu:

1. operater-eq

Ovaj operator upoređuje brojeve, provjerit će da li je vrijednost jednaka ili ne. Ako je jednako, onda se vraća 0.

# cat test.sh #!/bin/bash echo "unesi vrijednost promjenljive" pročita echo "unesi vrijednost promjenljive" pročita b if [ $a -eq $b ] then echo "Povratna vrijednost:: $?" echo "a i b su jednaki" else echo "Povratna vrijednost::$?" echo "a i b nisu jednaki" fi #

Izvođenje:

# sh test.sh unesite vrijednost varijable 2 unesite vrijednost varijable 3 Povratna vrijednost:: 1 a i b nisu jednaki # sh test.sh unesite vrijednost varijable 2 unesite vrijednost varijable 2 Povratna vrijednost: 0 a i b su jednaki #

U gornjem primjeru, prvi put smo uzeli brojeve 2 i 3 i sistem je vratio vrijednost 1, međutim, kada smo uzeli iste vrijednosti za a i b, varijabla vraća nulu.

2. operater-ge

Ovaj operator uspoređuje brojeve i provjerava vrijednosti veće ili jednake. Ako je vrijednost veća ili jednaka, tada je povratna vrijednost 0.

# cat test1.sh #!/bin/bash #diff program za -ge echo "unesite vrijednost za promjenljivu" pročitajte echo "unesite vrijednost za varijablu b" pročitajte b if [ $a -ge $b ] zatim echo "povratna vrijednost : :$?" echo "a je veće ili jednako b" inače echo "povratna vrijednost::$?" echo "a nije veće ili jednako b" fi #

3. operator -gt

Ovaj operator poređenja brojeva će testirati da je broj veći. Ako je vrijednost veća, onda vraća 0.

# cat test2.sh #!/bin/bash #differ for -gt b=100 echo "Unesite vrijednost veću od 100" pročitajte a if [ $a -gt $b ] zatim echo "Vrlo dobro" else echo "Ne baš dobro " fi

4. operater-le

Ovaj operator poređenja brojeva će testirati vrijednosti manje ili jednako. Ako je manji ili jednak, tada je povratna vrijednost 0.

#diff program za -le b=5 echo "unesite vrijednost manju ili jednaku 5" pročitajte a if [ $a -le $b ] zatim echo "ispravi" else echo "false" fi #

5. operater-lt

Ovaj operator poređenja brojeva će testirati vrijednosti za manje. Ako je broj manji onda je povratna vrijednost 0.

mob_info