Bash condiții în detaliu

„Ce se întâmplă dacă?” Aceasta este întrebarea de bază pentru orice dezvoltare. Ce se întâmplă dacă utilizatorul dă clic pe casetă? Ce se întâmplă dacă a are o valoare între 4 și 10? Ce se întâmplă dacă fișierul XY există? Ce se întâmplă dacă șirul 1 apare în șirul 2? Și ce ar fi dacă ar fi ușor de înțeles unde se află diferențele dintre [[]], [], (()) și test?

detaliu

Condițiile inspiră mai întâi viața în scripturi - fără ele ar putea face doar cele mai simple sarcini și buclele ar rula pentru totdeauna. Din păcate, condițiile din bash nu sunt deosebit de atractive pentru începători.

Chiar și un începător complet va înțelege imediat o interogare If, ​​sintaxa If-Then-Else se explică de la sine (mai multe despre bucle și interogări în Bash). Dar parantezele construiesc în interogări? Paranteze rotunde sau rotunde, ghilimele sau nu - sau poate deloc paranteze?

Prima condiție pe care o întâlniți este probabil ceva de genul „[$ i -eq 5]” într-o interogare if:

Ar trebui să se spună încă o dată că semnul egal egal este folosit doar pentru a compara șirurile; valorile numerice și altele sunt comparate cu ==. Și în această interogare standard simplă, există alte trei descoperiri interesante: Pe de o parte, „dacă” nu este deloc necesar aici, pe de altă parte, parantezele nu sunt nici ele - spațiile după/în fața parantezelor, pe de altă parte, se fac imediat ce sunt utilizate . De asemenea, ai putea scrie:

Parantezele pătrate nu sunt altceva decât un mod diferit de scriere a instrumentului „test”. Pur și simplu fac condiții mai complexe mai clare și mai ușor de scris. Și întrucât comanda după „&&” este executată numai dacă comanda anterioară raportează succes, „ecou” începe aici doar în exemplu când „var” este de fapt „Bună ziua”.

Parantezele pătrate duble, pe de altă parte, sunt implementarea proprie a lui Bash, care gestionează unele lucruri mai bine sau diferit. Dacă aruncați o privire asupra diferențelor dintre cele două pe baza unor exemple specifice, aveți un fir comun frumos pentru a aborda condițiile de bash deloc.

După comparație, parantezele rotunde duble intră în joc. Ele corespund în mare măsură comenzii „let”, care evaluează operațiile aritmetice.

Condiții cu [și [[

Test, [și [[oferă trei moduri diferite de comparație: șiruri, numere și fișiere. Ca și în exemplul de mai sus, șirurile sunt pur și simplu comparate cu "=" și "! =" (Inegale sau nu egale), deci:

Chiar și prima condiție nu mai funcționează dacă textul din „$ a” conține spații, de exemplu șirul „Hello World”. Apoi, aveți nevoie de ghilimele - sau paranteze duble:

Varianta test se comportă ca de obicei și împarte variabilele necitate, varianta Bash renunță la aceasta. Acest lucru atenuează o sursă tipică de eroare. Cu toate acestea, ar trebui mai degrabă ...

utilizați, așa că puneți RHS (partea dreaptă) între ghilimele. Deoarece [[stăpânește globul shell și înțelege totul în dreapta operatorului care nu se află între ghilimele ca glob. Asta înseamnă: Datorită acestei caracteristici, puteți, de exemplu, să verificați rapid dacă conținutul unei variabile se potrivește cu unul dintre șirurile „foobar_1”, „foobar_2” sau „foobar_3”:

Aceasta este o funcție excelentă, dar provoacă probleme dacă conținutul variabilei ar fi un șir cu paranteze pătrate, cum ar fi „[foobar]”. Fără ghilimele, variabila rezolvată ar avea ca rezultat următoarea afirmație:

Arată corect, dar RHS este văzut ca un glob, să spunem „f sau o sau b. „Și LHS-ul ca un șir. Deci, în general, este mai bine:

O caracteristică puternică face [[în cele din urmă superior: Utilizarea operatorului „=

„Poate fi comparat cu o expresie regulată, de exemplu aici:

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

Expresia din dreapta semnului egal este interpretată ca un POSEx RegEx de bază, așa că „$ a” ar trebui să înceapă cu 1 până la 5 cifre și să se termine cu „_foobar”.

Următoarele diferențe între [și [[nu mai privesc (numai) șirurile, ci combinațiile și fișierele.

Extinderea fișierelor și combinații

În plus față de operatorii de șiruri, ambele instrumente oferă tot felul de opțiuni pentru testarea la nivel de fișier, de exemplu dacă există un fișier (-e), două fișiere sunt identice (-ef), un fișier există și un director este (-d) și așa mai departe . Pagina manuală [https://man.cx/test] oferă o imagine de ansamblu completă.

Lucrul interesant aici este extinderea fișierelor, adică extensia automată a numelor de fișiere, care este prezentată în următorul exemplu:

Ambele variante se termină cu un fals - ce s-a întâmplat? [se extinde la toate numele fișierelor din director cu un asterisc, deci în acest exemplu primește două argumente. Dar, din moment ce se așteaptă un singur lucru, afirmația este neadevărată. Ar fi adevărat doar dacă ar exista exact un fișier cu o extensie „.txt” în director. [[eșuează dintr-un motiv complet diferit: numele fișierului nu este extins - în consecință este căutat aici un fișier numit „* .txt”.

Cu toate acestea, dacă doriți să știți dacă există cel puțin un fișier .txt, îl puteți căuta prin grep și ls și apoi verificați dacă șirul nu este gol (-n):

Marea diferență finală se referă acum la combinații. Varianta [[aici se bazează pur și simplu pe notația ceva mai comună a AND și OR:

Așadar, aici „$ a” trebuie să conțină textul „Bună ziua” ȘI „$ b” trebuie să fie „lume” SAU „pădure”. Prin urmare, comanda de testare folosește „-a” și „-o”, [[dar „&&” și „||”. Cu toate acestea, aceasta este doar o chestiune de stil, fără nicio influență suplimentară.

Operatii aritmetice

Chiar și atunci când se evaluează operațiile aritmetice, [[este superior comenzii de testare. În ambele cazuri, o comparație se face pur și simplu utilizând o abreviere: "-eq" pentru "egal", "-lt" pentru "mai puțin decât", "-ge" pentru "mai mare decât sau egal cu" și așa mai departe. Cu toate acestea, puteți calcula și între paranteze pătrate!

Varianta mai interesantă este în mod clar specialistul aici, adică paranteză rotundă dublă. Pe de o parte, există o sintaxă mai frumoasă cu operatorii mai cunoscuți:

În plus față de un astfel de operator mai ușor de înțeles sau egal, construcția paranteză poate manipula, de asemenea, ceva complet diferit, și anume variabile în stil C; adesea folosit pentru a crește variabilele de numărare:

Ambele bucle produc același rezultat; în varianta while, utilizarea în afară de o condiție devine puțin mai clară.

La pachet

Practic, condițiile sunt relativ simple și simple, există doar câteva aspecte care ar trebui luate în considerare: În general, vă puteți obișnui cu încredere cu parantezele pătrate duble și puteți utiliza comanda test dacă aveți nevoie de extensia automată a numelui de fișier.

Cu [[din nou, ar trebui să vă amintiți întotdeauna că RHS este tratat ca un glob fără ghilimele. Și cu evaluări sau operații aritmetice, cel mai bine este să vă obișnuiți cu parantezele rotunde duble: Atunci nu trebuie să vă regândiți niciodată de la [[la ((, recunoașteți imediat comparațiile aritmetice după tipul de paranteze și, de asemenea, puteți calcula cu ele mai ușor.

Tutorial Python, partea 7

Recursiuni și expresii regulate

Ieșire cu timp, până și pentru

Implementați bucle în bash

Acest site web este o marcă comercială a Vogel Communications Group. Puteți găsi o prezentare generală a tuturor produselor și serviciilor pe www.vogel.de

StartupStockPhotos; Triplet; Charlotte Coneybeer