Bash podmienky podrobne

„Čo ak?“ To je základná otázka pre akýkoľvek vývoj. Čo ak používateľ klikne na políčko? Čo ak má hodnota a hodnotu medzi 4 a 10? Čo ak súbor XY existuje? Čo ak sa reťazec 1 objaví v reťazci 2? A čo keby bolo intuitívne pochopiteľné, kde rozdiely medzi [[]], [], (()) a testom spočívajú?

rozdiely medzi

Podmienky najskôr vdýchli skriptám život - bez nich by mohli robiť iba tie najjednoduchšie úlohy a slučky by bežali navždy. Podmienky v bashe nie sú bohužiaľ pre začiatočníkov zvlášť atraktívne.

Aj úplný začiatočník okamžite porozumie dotazu If, syntax If-Then-Else je úplne jasná (viac o cykloch a dotazoch v bashe). Ale konzolové konštrukcie v dotazoch? Hranaté alebo okrúhle zátvorky, úvodzovky alebo nie - alebo možno vôbec žiadna zátvorka?

Prvá podmienka, ktorú narazíte, je pravdepodobne v dotaze if niečo ako „[$ i -eq 5]“:

Je potrebné ešte raz povedať, že jednoduché znamienko rovnosti sa používa iba na porovnanie reťazcov; číselné hodnoty a ďalšie sa porovnávajú s ==. A v tomto jednoduchom štandardnom dotaze sú ďalšie tri zaujímavé zistenia: Na jednej strane tu „ak“ vôbec nie je potrebné, na druhej strane konzoly tiež nie sú - medzery za/pred zátvorkami však urobte hneď, ako sa použijú . Môžete tiež napísať:

Hranaté zátvorky nie sú ničím iným ako iným spôsobom písania „testovacieho“ nástroja. Jednoducho objasňujú a uľahčujú písanie zložitejších podmienok. A keďže príkaz po „&&“ sa vykoná iba v prípade, že predchádzajúci príkaz hlási úspech, „echo“ sa tu začína iba v príklade, keď „var“ je v skutočnosti „Hello“.

Dvojité hranaté zátvorky sú na druhej strane implementáciou špecifickou pre Bash, ktorá zvláda niektoré veci lepšie alebo inak. Ak sa pozriete na rozdiely medzi týmito dvoma na základe konkrétnych príkladov, máte pekné spoločné vlákno, aby ste sa vôbec priblížili k bash podmienkam.

Po porovnaní prichádzajú do úvahy dvojité okrúhle zátvorky. Vo veľkej miere zodpovedajú príkazu „let“, ktorý vyhodnocuje aritmetické operácie.

Podmienky s [a [[

Test [] a [[ponúkajú tri rôzne režimy porovnania: reťazce, čísla a súbory. Rovnako ako v príklade vyššie, reťazce sa jednoducho porovnávajú s reťazcami „=“ a „! =“ (Nerovnaké alebo nerovnaké), takže:

Ani prvá podmienka už nefunguje, ak text v „$ a“ obsahuje medzery, napríklad reťazec „Hello World“. Potom potrebujete úvodzovky - alebo dvojité zátvorky:

Testovací variant sa správa ako obvykle a rozdeľuje nekótované premenné, Bashov variant sa od toho obchádza. To zmierňuje typický zdroj chýb. Mali by ste však radšej ...

použite, preto vložte RHS (pravá strana) do úvodzoviek. Pretože [[masters shell globbing a chápe všetko napravo od operátora, ktoré nie je v úvodzovkách ako glob. To znamená: Vďaka tejto funkcii môžete napríklad rýchlo skontrolovať, či sa obsah premennej zhoduje s jedným z reťazcov „foobar_1“, „foobar_2“ alebo „foobar_3“:

Je to skvelá funkcia, ale spôsobí problémy, ak bude obsahom premennej reťazec so hranatými zátvorkami, napríklad „[foobar]“. Bez úvodzoviek by vyriešená premenná mala za následok nasledujúce vyhlásenie:

Vyzerá to dobre, ale RHS sa vníma ako glóbus, napríklad „f alebo o alebo b. “, A LHS ako struna. Takže je to všeobecne lepšie:

Vďaka výkonnej funkcii je [[konečne vynikajúce: Používanie operátora „=

„Dá sa to porovnať s regulárnym výrazom, napríklad tu:

^ [[: digit:]] _ foobar]] && echo Pravda

Výraz napravo od znamienka rovnosti sa interpretuje ako základný regulárny výraz POSIX, takže „$ a“ by malo začínať 1 až 5 číslicami a končiť „_foobar“.

Ďalšie rozdiely medzi [a [[už sa netýkajú (iba) reťazcov, ale kombinácií a súborov.

Rozšírenie súborov a kombinácie

Okrem operátorov reťazcov oba nástroje ponúkajú všetky druhy možností testovania na úrovni súborov, napríklad či existuje súbor (-e), dva súbory sú identické (-ef), súbor existuje a adresár je (-d) atď. . Manuálna stránka [https://man.cx/test] poskytuje kompletný prehľad.

Vzrušujúcou vecou je rozšírenie súborov, t. J. Automatické rozšírenie názvov súborov, ktoré je zobrazené v nasledujúcom príklade:

Obidva varianty sa končia falošne - čo sa stalo? [sa rozšíri na všetky názvy súborov v adresári s hviezdičkou, takže v tomto príklade dostane dva argumenty. Ale keďže sa očakáva iba jedna vec, tvrdenie je nepravdivé. Bola by to pravda, iba keby v adresári bol práve jeden súbor s príponou „.txt“. [[zlyhá z úplne iného dôvodu: názov súboru nie je rozšírený - následne sa tu vyhľadá súbor s názvom „* .txt“.

Ak však chcete vedieť, či existuje aspoň jeden súbor .txt, môžete ho vyhľadať pomocou výrazov grep a ls a skontrolovať, či reťazec nie je prázdny (-n):

Veľký konečný rozdiel sa teraz týka kombinácií. Variant [[tu sa jednoducho spolieha na trochu bežnejšiu notáciu AND a OR:

Takže „$ a“ musí obsahovať text „Hello“ A „$ b“ musí byť „world“ ALEBO „forest“. Testovací príkaz preto používa „-a“ a „-o“, [[ale „&&“ a „||“. Toto je však iba otázka štýlu bez ďalšieho ovplyvňovania.

Aritmetické operácie

Aj pri hodnotení aritmetických operácií je [[nadradený testovacím príkazom. V obidvoch prípadoch sa porovnania jednoducho uskutočňujú pomocou skratky: „-eq“ pre „rovnaké“, „-lt“ pre „menšie ako“, „-ge“ pre „väčšie alebo rovné“ atď. Môžete však počítať aj v dvojitých hranatých zátvorkách!

Vzrušujúcejšou variantou je tu jednoznačne špecialista, teda dvojitá okrúhla konzola. Na jednej strane je tu príjemnejšia syntax so známymi operátormi:

Okrem takéhoto zrozumiteľnejšieho operátora, ktorý je menší alebo rovnaký, môže konzolová konštrukcia manipulovať aj s niečím úplne iným, konkrétne s premennými v štýle C; často sa používa na zvýšenie počítania premenných:

Obe slučky vedú k rovnakému výsledku; vo variante while je použitie mimo podmienky trochu zreteľnejšie.

Zobrať

Podmienky sú v zásade pomerne jednoduché a priame, treba brať do úvahy iba niekoľko aspektov: Všeobecne si môžete s istotou zvyknúť na dvojité hranaté zátvorky a použiť príkaz test, ak potrebujete automatickú príponu názvu súboru.

S [[opäť by ste si mali vždy uvedomiť, že s RHS sa zaobchádza ako s globusom bez úvodzoviek). A pri aritmetických vyhodnoteniach alebo operáciách je najlepšie zvyknúť si na dvojité okrúhle zátvorky: Potom už nikdy nemusíte prehodnocovať od [[do ((, rozpoznávať aritmetické porovnania okamžite podľa typu zátvoriek a tiež s nimi ľahšie počítať.

Výukový program pre Python, časť 7

Rekurzie a regulárne výrazy

Výstup s while, do a pre

Implementujte slučky v bashe

Táto webová stránka je ochrannou známkou spoločnosti Vogel Communications Group. Prehľad všetkých produktov a služieb nájdete na www.vogel.de

StartupStockPhotos; Triplet; Charlotte Coneybeer