dacă declarațiile!
decizii, decizii.
Introducere
Bash dacă declarațiile sunt foarte utile. În această secțiune a tutorialului nostru de scripturi Bash veți afla modalitățile prin care puteți utiliza if declarații în scripturile Bash pentru a ajuta la automatizarea sarcinilor.dacă declarațiile (și, în strânsă legătură, declarațiile de caz) ne permit să luăm decizii în scripturile noastre Bash. Acestea ne permit să decidem dacă să rulăm sau nu o bucată de cod pe baza condițiilor pe care le putem stabili., Dacă declarațiile, combinate cu bucle (pe care le vom analiza în secțiunea următoare) ne permit să facem scripturi mult mai complexe, care pot rezolva sarcini mai mari.
la fel ca în secțiunile anterioare, sintaxa lor este foarte specifică, așa că rămâneți la curent cu toate detaliile mici.
Basic If declarații
o instrucțiune basic if spune în mod eficient, dacă un anumit test este adevărat, atunci efectuați un set dat de acțiuni. Dacă nu este adevărat, atunci nu efectuați aceste acțiuni., Dacă urmează formatul de mai jos:
dacă
<comenzi>
fi
Nimic între atunci și fi (cazul invers) va fi executat numai în cazul testului (între paranteze drepte) este adevărat.
să ne uităm la un exemplu simplu:
if_example.sh
- #!/bin / bash
- # Basic if declarație
- dacă
- atunci
- echo Hei că\’s un număr mare.,
- pwd
- fi
- prezent
Să-l rupe în jos:
- Linia 4 – Să vedem dacă primul argument în linia de comandă este mai mare decât 100
- Linia 6 și 7 – doar se Va rula dacă testul pe linia 4 returnează true. Puteți avea cât mai multe comenzi aici, după cum doriți.
- linia 6-backslash-ul ( \ ) din fața citatului unic ( ‘ ) este necesar deoarece citatul unic are o semnificație specială pentru bash și nu dorim acest sens special. Backslash scapă sensul special pentru a face din nou un citat simplu simplu.,
- linia 8-fi semnalează sfârșitul instrucțiunii if. Toate comenzile după aceasta vor fi rulate în mod normal.
- linia 10-deoarece această comandă se află în afara instrucțiunii if, aceasta va fi rulată indiferent de rezultatul instrucțiunii if.
- ./if_example.sh 15
- Fri 5 Feb 9:06:30 2021
- ./if_example.sh 150
- Hei, e un număr mare.
- / home / ryan/bin
- Fri 5 Feb 9: 06: 30 2021
este întotdeauna o bună practică pentru a testa script-uri cu intrare care acoperă diferite scenarii care sunt posibile.,
Test
parantezele pătrate () din instrucțiunea if de mai sus sunt de fapt o referință la testul de comandă. Aceasta înseamnă că toți operatorii care permit testarea pot fi utilizați și aici. Căutați pagina man pentru test pentru a vedea toți operatorii posibili (există destul de puțini), dar unii dintre cei mai obișnuiți sunt enumerați mai jos.
Operator | Descriere |
---|---|
! Expresie | expresia este falsă. |
-n STRING | lungimea șirului este mai mare decât zero., |
-Z STRING | lungimea șirului este zero (adică este goală). |
STRING1 = STRING2 | STRING1 este egal cu STRING2 |
STRING1 != STRING2 | STRING1 nu este egal cu STRING2 |
INTEGER1 -eq INTEGER2 | INTEGER1 este numeric egală cu INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 este numeric mai mare decât INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 este numeric mai mic decât INTEGER2 |
-d FIȘIERUL | FIȘIERUL există și este un director., |
-e fișier | fișier există. |
-fișier r | fișier există și se acordă permisiunea de citire. |
-s FILE | fișier există și dimensiunea este mai mare decât zero (de exemplu. nu este gol). |
-fișier w | fișier există și se acordă permisiunea de scriere. |
-fișier x | fișier există și se acordă permisiunea de executare. |
câteva puncte de reținut:
- = este ușor diferit de-eq. va reveni fals ca = face o comparație șir (de ex., caracter pentru caracter la fel) întrucât-eq face o comparație numerică sensul Va reveni adevărat.
- când ne referim la fișierul de mai sus, înseamnă de fapt o cale. Amintiți-vă că o cale poate fi absolută sau relativă și se poate referi la un fișier sau un director.
- deoarece este doar o referire la testul de comandă, putem experimenta și trage probleme cu testul pe linia de comandă pentru a ne asigura că înțelegerea noastră a comportamentului său este corectă.
- test 001 = 1
- ecou $?
- 1
- test 001-eq 1
- ecou $?,
- 0
- touch myfile
- test -s myfile
- echo $?
- 1
- ls /etc > myfile
- test -s myfile
- echo $?
- 0
să – l rupe în jos:
- linia 1-Efectuați o comparație bazată pe șir. Testul nu imprimă rezultatul, așa că, în schimb, verificăm starea de ieșire, ceea ce vom face pe linia următoare.
- Linia 2-variabila $? păstrează starea de ieșire a comenzii rulate anterior (în acest caz test). 0 înseamnă adevărat (sau succes). 1 = fals (sau eșec).,
- Linia 4-de data aceasta efectuăm o comparație numerică.
- Linia 7-Creați un nou fișier necompletat myfile (presupunând că myfile nu există deja).
- linia 8 – Dimensiunea fișierului meu este mai mare decât zero?
- Linia 11 – a Redirecționa o parte a conținutului în myfile deci dimensiunea este mai mare decât zero.
- linia 12-testați din nou Dimensiunea fișierului myfile. De data aceasta este adevărat.
indentare
veți observa că în instrucțiunea if de mai sus am indentat comenzile care au fost executate dacă instrucțiunea a fost adevărată., Aceasta este denumită indentare și este o parte importantă a scrierii unui cod bun și curat (în orice limbă, nu doar scripturi Bash). Scopul este de a îmbunătăți lizibilitatea și de a face mai greu pentru noi să facem greșeli simple și stupide. Nu există reguli privind indentarea în Bash, astfel încât să puteți indenta sau să nu Indentați oricum doriți și scripturile dvs. vor rula în continuare Exact la fel. Mi-ar recomanda foarte Indentați codul cu toate acestea (mai ales ca script-uri obține mai mare) în caz contrar, veți găsi ce în ce mai dificil pentru a vedea structura în script-uri.,
imbricate if declarații
vorbind de indentare. Iată un exemplu perfect de atunci când face viața mai ușoară pentru tine. Este posibil să aveți cât mai multe declarații dacă este necesar în interiorul script-ul. De asemenea, este posibil să aveți o declarație if în interiorul unei alte declarații if. De exemplu, putem analiza un număr dat pe linia de comandă astfel:
să – l descompunem:
- Linia 4-Efectuați următoarele, numai dacă primul argument al liniei de comandă este mai mare de 100.
- linia 8-Aceasta este o variație de lumină pe instrucțiunea if., Dacă dorim să verificăm o expresie, atunci putem folosi parantezele duble la fel cum am făcut-o pentru variabile.
- linia 10 – se execută numai dacă ambele declarații sunt adevărate.Yo dawg, am turma vă place dacă declarații așa că am pus o declarație dacă în interiorul dumneavoastră dacă declarație.
Xzibit
(Xzibit nu a spus de fapt că, dar eu sunt sigur că ar fi, a găzduit Pimp Script-ul meu Bash.,)
puteți cuib cât mai multe dacă declarații doriți, dar ca o regulă generală de degetul mare, dacă aveți nevoie pentru a cuib mai mult de 3 niveluri de adâncime, probabil, ar trebui să aibă o cred despre reorganizarea logica.uneori dorim să efectuăm un anumit set de acțiuni dacă o declarație este adevărată și un alt set de acțiuni dacă este falsă. Putem acomoda acest lucru cu mecanismul else.,
dacă
<comenzi>
mai mult
<alte comenzi>
fiAcum am putea citi cu ușurință dintr-un fișier dacă acesta este furnizat ca argument în linia de comandă, mai citit de la intrarea STANDARD.
else.sh
- #!/bin/bash
- # altcineva exemplu
- dacă
- atunci
- nl $1
- mai mult
- nl /dev/stdin
- fi
Elif Altceva
Uneori am putea avea o serie de condiții care pot duce la diferite căi.,
dacă
<comenzi>
elif<comenzi diferite>
mai mult
<alte comenzi>
fiDe exemplu, poate fi cazul în care, dacă ai 18 ani sau peste, s-ar putea merge la petrecere. Dacă nu ești, dar ai o scrisoare de la părinții tăi, poți pleca, dar trebuie să te întorci înainte de miezul nopții. Altfel nu poți pleca.
puteți avea cât mai multe ramuri elif doriți. Restul final este, de asemenea, opțional.,
operații booleene
uneori vrem să facem ceva doar dacă sunt îndeplinite mai multe condiții. Alteori am dori să efectuăm acțiunea dacă una dintre mai multe condiții este îndeplinită. Putem găzdui aceste cu operatorii boolean.
- și &&
- sau – ||
De exemplu, poate vrem doar pentru a efectua o operație dacă fișierul este ușor de citit și are o dimensiune mai mare decât zero.
and.sh
- #!,/bin/bash
- # și exemplu
- dacă &&
- atunci
- echo Acest fișier este util.
- fi
Poate am dori să facem ceva ușor diferit dacă utilizatorul este fie bob, fie andy.
or.sh
- #!/bin/bash
- # sau exemplu
- dacă ||
- atunci
- ls-alh
- mai mult
- e
- fi
Declarațiile de Caz
Uneori ne-am putea dori să ia căi diferite la bază o variabilă de potrivire o serie de modele., Am putea folosi o serie de declarații if și elif, dar care ar crește în curând să fie unweildly. Din fericire, există o declarație de caz care poate face lucrurile mai curate., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esacHere is a basic example:
case.sh
- #!,/bin/bash
- # exemplu de caz
- cazul 1 $în
- start)
- echo incepand
- ;;
- stop)
- echo stoping
- ;;
- restart)
- echo repornirea
- ;;
- *)
- echo nu\’t știu
- ;;
- esac
Să-l rupe în jos:
- Linia 4 – Această linie începe casemechanism.
- linia 5-Dacă $1 este egal cu „start”, atunci efectuați acțiunile ulterioare. ) semnifică sfârșitul modelului.,
- Linia 7-identificăm sfârșitul acestui set de declarații cu un dublu semi-colon ( ;; ). În urma acestui lucru este următorul caz de luat în considerare.
- linia 14 – amintiți-vă că testul pentru fiecare caz este un model. * Reprezintă orice număr de orice caracter. Este esențial o captură toate dacă pentru cazul în care nici unul dintre celelalte cazuri se potrivesc. Nu este necesar, dar este adesea folosit.
- linia 17-esac este case backwards și indică faptul că suntem la sfârșitul instrucțiunii case. Orice alte declarații după aceasta vor fi executate în mod normal.
- . /case.sh începe
- începând
- .,/case.sh reporniți
- repornirea
- ./case.sh bla
- nu stiu
Acum să ne uităm la mai puțin de un exemplu mai complex în cazul în care modele sunt utilizate de un pic mai mult.
rezumat
dacă efectuați un set de comenzi dacă un test este adevărat. altfel, dacă testul nu este adevărat, atunci efectuați un set diferit de comenzi. elif dacă testul anterior a revenit fals, încercați acest lucru. && efectuați operația și. / / Efectuați operația or. case alegeți un set de comenzi de executat în funcție de un șir care se potrivește unui anumit model.,indentarea indentarea face codul mult mai ușor de citit. Devine din ce în ce mai important pe măsură ce Scripturile Bash devin mai lungi. Planificarea acum că script-uri sunt obtinerea un pic mai complexe, probabil, veți dori să-și petreacă un pic de timp de gândire despre cum le structura înainte de scufundări în.activități
acum să luăm câteva decizii.
- creați un script Bash care va avea 2 numere ca argumente în linia de comandă. Acesta va imprima pe ecran cea mai mare dintre cele două numere.,
- creați un script Bash care va accepta un fișier ca argument în linia de comandă și îl va analiza în anumite moduri. de exemplu. ai putea verifica dacă fișierul este executabil sau inscriptibil. Ar trebui să imprimați un anumit mesaj dacă este adevărat și altul dacă este fals.
- creați un script Bash care va imprima un mesaj bazat pe ce zi a săptămânii este (de ex. „Happy hump day” pentru Wedensday, „TGIF” pentru vineri, etc).