Hvis Uttalelser!
Avgjørelser, avgjørelser.
Innledning
Bash if-setningene er svært nyttig. I denne delen av vår Bash-Scripting Opplæringen vil du lære hvordan du kan bruke hvis uttalelser i Bash-skript for å automatisere oppgaver.
Hvis uttalelser (som er nært knyttet til hverandre, case-uttrykk) tillate oss å ta beslutninger i vår Bash-skript. De tillater oss å avgjøre hvorvidt eller ikke å kjøre et stykke kode basert på forhold som vi kan stille., Hvis uttalelser, kombinert med sløyfer (som vi skal se på i neste avsnitt) gir oss mulighet til å gjøre mye mer omfattende skript som kan løse større oppgaver.
Liker hva vi har sett på i tidligere kapitler, deres syntaks er veldig spesifikk, så hold deg på toppen av alle de små detaljene.
Grunnleggende Om Uttalelser
En enkel if-setning effektivt sier, hvis en bestemt test er sann, og deretter utføre et gitt sett av handlinger. Hvis det ikke er sant så ikke utføre disse handlingene., Hvis følger formatet nedenfor:
hvis
da
<kommandoer>
– fi
Noe mellom da og fi (hvis bakover) vil bli henrettet hvis testen (mellom hakeparentesene) er sann.
La oss se på et enkelt eksempel:
if_example.sh
- #!/bin/bash
- # Grunnleggende om uttalelse
- hvis
- klikk
- echo Hei det\ \ \ ‘s a stort antall.,
- pwd
- fi
- dato
La oss bryte det ned:
- Line 4 – La oss se om de første kommando linje argumentet er større enn 100
- Linje 6 og 7 – Vil bare få kjøre hvis testen på linje 4 returnerer true. Du kan ha så mange kommandoer her som du liker.
- Line 6 – omvendt skråstrek ( \ ) foran enkel apostrof ( ‘ ) er nødvendig som en enkel apostrof har en spesiell betydning for bash og vi vil ikke ha en spesiell betydning. Omvendt skråstrek rømming av spesiell betydning for å gjøre det til en vanlig enkel apostrof igjen.,
- Linje 8 – fi-signaler slutten av if-setningen. Alle kommandoer etter dette vil bli kjørt som normalt.
- Line 10 – Fordi denne kommandoen er utenfor if-setning vil det bli kjørt uavhengig av utfallet av en if-setning.
- ./if_example.sh 15
- Fre 5 Feb 9:06:30 2021
- ./if_example.sh 150
- Hei det er et stort antall.
- /home/ryan/utskuff
- Fre 5 Feb 9:06:30 2021
Det er alltid lurt å teste dine skript med innspill som dekker de ulike scenarioene som er mulig.,
Test
hakeparenteser ( ) i en if-setning ovenfor er faktisk en referanse til kommando-test. Dette betyr at alle operatører som tester gjør kan brukes her også. Se i man-siden for test for å se alle de mulige operatører (det er ganske mange), men noen av de mer vanlige de er listet opp nedenfor.
– Operator | Beskrivelse |
---|---|
! UTTRYKKET | UTTRYKKET er usant. |
-n STRING | lengden av STRENGEN er større enn null., |
-z STRING | Den lengh av STRENGEN er null (dvs. den er tom). |
STRENG1 = STRENG2 | STRENG1 er lik STRENG2 |
STRENG1 != STRENG2 | STRENG1 er ikke lik for å STRENG2 |
INTEGER1 -eq INTEGER2 | INTEGER1 er numerisk lik INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 er tallmessig større enn INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 er tallmessig mindre enn INTEGER2 |
-d-FIL | FIL eksisterer og er en katalog., |
-e-FILEN | FILEN eksisterer. |
-r-FIL | FIL eksisterer og les tillatelse er gitt. |
-s-FIL | FILEN finnes, og det er størrelsen er større enn null (dvs. det er ikke tomme). |
-w FIL | FIL eksisterer og skrive tillatelse er gitt. |
-x-FIL | FIL eksisterer og utføre tillatelse er gitt. |
Et par punkter å merke seg:
- = er litt forskjellig -eq. vil returnere false = gjør en streng sammenligning (dvs., tegn for tegn samme), mens -eq gjør en numerisk sammenligning mening vil returnere true.
- Når vi refererer til FILEN ovenfor, hvor vi faktisk betyr en bane. Husk at en bane kan være absolutte eller relative og kan referere til en fil eller en katalog.
- Fordi det er bare en referanse til kommandoen test vi kan eksperimentere og problemer med å skyte med test på kommandolinjen for å sørge for at vår forståelse av sin oppførsel er riktig.
- test 001 = 1
- echo $?
- 1
- test 001 -eq 1
- echo $?,
- 0
- trykk myfile
- test -s myfile
- echo $?
- 1
- ls /etc > myfile
- test -s myfile
- echo $?
- 0
La oss bryte det ned:
- Line 1 – Utføre en streng basert sammenligningen. Testen ikke skrive ut resultatet, så i stedet har vi sjekke det exit status som er hva vi vil gjøre på neste linje.
- Line 2 – variabelen $? holder exit status for tidligere kjør-kommandoen (i dette tilfellet test). 0 betyr at EKTE (og suksess). 1 = FALSE (eller fiasko).,
- Line 4 – Denne gangen har vi utfører en numerisk sammenligning.
- Linje 7 – Opprette en ny, tom fil myfile (forutsatt at myfile ikke allerede eksisterer).
- Linje 8 – Er på størrelse med myfile større enn null?
- Linje 11 – Redirect noe av innholdet i myfile så det er størrelsen er større enn null.
- Linje 12 – Test størrelsen på myfile igjen. Denne gangen er det SANT.
Innrykk
Du vil legge merke til at i en if-setning ovenfor vi rykket inn kommandoene som ble kjørt hvis påstanden var sann., Dette er referert til som rykker inn og er en viktig del av å skrive god, ren kode (i alle språk, ikke bare Bash-skript). Målet er å bedre lesbarheten og gjør det vanskeligere for oss å lage enkle, tåpelige feil. Det er ikke noen regler for innrykk i Bash, slik at du kan rykke inn eller ikke innrykk men du liker og dine skript vil fortsatt kjøre akkurat det samme. Jeg vil sterkt anbefale deg å gjøre innrykk koden imidlertid (spesielt som skript få større) ellers vil du finne det stadig vanskeligere å se strukturen i dine skript.,
Nestede Hvis uttalelser
Snakker av innrykk. Her er et perfekt eksempel på når det gjør livet enklere for deg. Du kan ha så mange om uttalelser som er nødvendige inne i skriptet. Det er også mulig å ha en if-setning inne i en annen if-setning. Vi kan For eksempel ønsker å analysere et antall som er angitt på kommandolinjen slik:
La oss bryte det ned:
- Line 4 – Utfør følgende, bare hvis den første kommando linje argumentet er større enn 100.
- Linje 8 – Dette er en lys variant av en if-setning., Hvis vi ønsker å sjekke et uttrykk, så vi kan bruke de doble klammer, akkurat som vi gjorde for variabler.
- Line 10 – får Bare kjøre hvis begge hvis utsagn som er sanne.
Yo dawg, jeg flokken du liker hvis uttalelser så legger jeg en if-setning inne i if-setning.
Xzibit
(Xzibit ikke egentlig si det, men jeg er sikker på at han ville ha, hadde han vert Pimp My Bash-Skript.,)
Du kan reir som mange om uttalelser som du liker, men som en generell tommelfingerregel hvis du trenger til å hekke mer enn 3 nivåer dypt bør du sannsynligvis har en tror om omlegging din logikk.
Hvis Annet
noen Ganger ønsker vi å utføre en bestemt sett av handlinger hvis en påstand er sann, og et annet sett av handlinger hvis den er usann. Vi kan imøtekomme dette med den andre mekanismen.,
hvis
da
<kommandoer>
annet
<andre kommandoer>
– fi
Nå kunne vi lett lese fra en fil hvis det er levert som en kommandolinje-argumenter, andre leser fra STDIN.
else.sh
- #!/bin/bash
- # annet eksempel
- hvis
- klikk
- nl $1
- andre
- nl /dev/stdin
- fi
Hvis Elif Annet
Noen ganger kan vi ha en rekke forhold som kan føre til forskjellige baner.,
hvis
da
<kommandoer>
elif
da
<forskjellige kommandoer>
annet
<andre kommandoer>
– fi
For eksempel kan det være slik at hvis du er 18 eller over kan du gå til festen. Hvis du ikke, men du har et brev fra dine foreldre kan du gå, men må være tilbake før midnatt. Ellers kan du ikke gå.
Du kan ha så mange elif grener som du liker. Den endelige annet er også valgfritt.,
Boolske Operasjoner
noen Ganger er vi bare ønsker å gjøre noe hvis flere vilkår er oppfylt. Andre ganger ønsker vi å utføre handlingen dersom ett av flere vilkår er oppfylt. Vi kan ta imot disse med boolske operatorer.
- og – &&
- eller – ||
For eksempel kanskje vi bare ønsker å utføre en operasjon hvis filen er lesbar, og har en størrelse som er større enn null.
and.sh
- #!,/bin/bash
- # og eksempel
- hvis &&
- klikk
- echo Denne filen er nyttig.
- fi
Kanskje vi ønsker å utføre noe litt annerledes hvis brukeren er enten bob eller andy.
or.sh
- #!/bin/bash
- # eksempel
- hvis ||
- klikk
- ls -alh
- andre
- ls
- fi
Case-uttrykk
Noen ganger kan vi ønske å ta forskjellige veier, som er basert på en variabel matchende en rekke mønstre., Vi kan bruke en rekke hvis og elif uttrykk, men som snart ville vokse til å bli unweildly. Heldigvis er det er en case-uttrykk som kan gjøre ting mer oversiktlig., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # tilfellet eksempel
- tilfellet $1
- start)
- echo starter
- ;;
- stopp)
- echo stoping
- ;;
- start på nytt)
- echo starte på nytt
- ;;
- *)
- echo don\ \ ‘t know
- ;;
- esac
La oss bryte det ned:
- Line 4 – Denne linjen, begynner den casemechanism.
- Line 5 – Hvis $1 er lik «start» og deretter utføre den påfølgende handlinger. i ) betyr slutten av mønsteret.,
- Linje 7 – Vi identifiserer slutten av dette settet av utsagn med en dobbel semikolon ( ;; ). Etter dette er neste sak å vurdere.
- Linje 14 – Husk at testen for hvert tilfelle er et mønster. Den * representerer alle antall av alle tegn. Det er essentialy en fange alle hvis for hvis ingen av de andre tilfeller kampen. Det er ikke nødvendig, men er ofte brukt.
- Linje 17 – esac er tilfelle bakover og indikerer at vi er på slutten av case-uttrykk. Noen andre uttalelser etter dette vil bli utført som normalt.
- ./case.sh start
- start
- .,/case.sh nytt
- for å starte
- ./case.sh blah
- vet ikke
la oss se på et litt mer komplisert eksempel hvor mønstre er brukt litt mer.
Oppsummering
Aktiviteter
la oss Nå gjøre noen beslutninger.
- Lage et Bash-script som vil ta 2 tall som kommandolinje-argumenter. Det vil skrive ut på skjermen er den største av de to tall.,
- Lage et Bash-script som vil godta en fil som en kommandolinje argumenter og analysere den på bestemte måter. f.eks. du kan sjekke om filen kjørbar eller skrivbar. Du bør skrive ut en bestemt melding hvis det er sant, og en annen hvis verdien er false.
- Lage et Bash-script som vil skrive ut en melding basert på hvilken dag i uken det er (f.eks. «Happy hump day’ for Wedensday, ‘TGIF’ for fredag etc.).