hvis udsagn!
beslutninger, beslutninger.
Indledning
Bash hvis udsagn er meget nyttige. I dette afsnit af vores Bash Scripting Tutorial lærer du de måder, du kan bruge, hvis udsagn i dine Bash scripts til at hjælpe med at automatisere opgaver.
Hvis udsagn (og nært beslægtede sagsangivelser) giver os mulighed for at træffe beslutninger i vores Bash-scripts. De giver os mulighed for at beslutte, om vi skal køre et stykke kode baseret på betingelser, som vi måtte indstille., Hvis udsagn kombineret med sløjfer (som vi vil se på i næste afsnit) giver os mulighed for at lave meget mere komplekse scripts, der kan løse større opgaver.som hvad vi har set på i tidligere afsnit, er deres syntaks meget specifik, så hold dig på toppen af alle de små detaljer.
grundlæggende hvis udsagn
en grundlæggende if-erklæring siger effektivt, hvis en bestemt test er sand, skal du udføre et givet sæt handlinger. Hvis det ikke er sandt, skal du ikke udføre disse handlinger., Hvis følgende format nedenfor:
hvis
derefter
<kommandoer>
internet
Noget mellem dengang og internetadgang (hvis baglæns) vil blive udført, kun, hvis testen (mellem firkantede parenteser) er sandt.
lad os se på et simpelt eksempel:
if_example.sh
- #!/bin/bash
- # Basic if statement
- hvis
- så
- echo Hey that\’s a large number.,
- pwd
- internet
- dato
Lad os bryde det ned:
- Line 4 – Lad os se, om den første command line argument er større end 100
- Linje 6 og 7 – Vil kun blive vist, hvis testen på linje 4 returnerer true. Du kan have så mange kommandoer her, som du vil.
- linje 6-backslash ( \ ) foran det enkelte citat ( ‘ ) er nødvendigt, da det enkelte Citat har en særlig betydning for bash, og vi ønsker ikke den særlige betydning. Backslash undslipper den særlige betydning for at gøre det til et normalt almindeligt enkelt citat igen.,linje 8-fi signalerer slutningen af if-sætningen. Alle kommandoer efter dette vil blive kørt som normalt.
- linje 10 – fordi denne kommando er uden for if-sætningen, vil den blive kørt uanset resultatet af if-sætningen.
- ./if_example.sh 15
- Fre 5 Feb 9:06:30 2021
- ./if_example.sh 150
- Hey, det er et stort antal.
- /home/ryan/bin
- Fre 5 Feb 9:06:30 2021
Det er altid god praksis at teste dine scripts med input, der dækker de forskellige scenarier, der er muligt.,
Test
de firkantede parenteser ( ) i if-sætningen ovenfor er faktisk en henvisning til kommandotesten. Det betyder, at alle de operatører, som test tillader, også kan bruges her. Slå op på man-siden for test for at se alle de mulige operatører (der er ganske mange), men nogle af de mere almindelige er angivet nedenfor.
Operator | Beskrivelse |
---|---|
! Udtryk | udtrykket er falsk. |
-n STRING | længden af strengen er større end nul., |
-STRING STRING | strengens længde er nul (dvs.den er tom). |
STRING1 = STRING2 | STRING1 er lig med STRING2 |
STRING1 != STRENG2 | STRENG1 er ikke lige til at STRENG2 |
INTEGER1 -eq INTEGER2 | INTEGER1 er numerisk lig med INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 er numerisk større end INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 er numerisk mindre end INTEGER2 |
-d-FIL | FIL findes og er en mappe., |
-E fil | filen findes. |
-R fil | filen findes, og den læste tilladelse gives. |
-S fil | filen findes, og dens størrelse er større end nul (dvs. den er ikke tom). |
-FILE fil | filen findes, og skrivetilladelsen gives. |
-FILE fil | filen findes, og kør tilladelsen gives. |
Et par punkter at bemærke:
- = er lidt anderledes -eq. vil returnere falsk som = gør en streng sammenligning (dvs .. , tegn for tegn det samme) hvorimod-E.gør en numerisk sammenligning betydning vil returnere sand.
- når vi henviser til filen ovenfor, betyder vi faktisk en sti. Husk, at en sti kan være absolut eller relativ og kan henvise til en fil eller en mappe.fordi det kun er en henvisning til kommandotesten, kan vi eksperimentere og fejlfinding med test på kommandolinjen for at sikre, at vores forståelse af dens adfærd er korrekt.
- test 001 = 1
- echo $?
- 1
- test 001 -eq 1
- echo $?,
- 0
- touch myfile
- test-s myfile
- echo $?
- 1
- ls /etc > myfile
- test -s minfil
- echo $?
- 0
lad os bryde det ned:
- linje 1 – Udfør en strengbaseret sammenligning. Test udskriver ikke resultatet, så i stedet kontrollerer vi, at det er udgangsstatus, hvilket er, hvad vi vil gøre på næste linje.
- linje 2-variablen $? holder e .it status for den tidligere køre kommando (i dette tilfælde test). 0 betyder sand (eller succes). 1 = falsk (eller fiasko).,
- linje 4-Denne gang udfører vi en numerisk sammenligning.
- linje 7-Opret en ny tom fil myfile (forudsat at myfile ikke allerede findes).
- linje 8-er størrelsen af myfile større end nul?linje 11-Omdiriger noget indhold til myfile, så det er størrelsen er større end nul.
- linje 12-Test størrelsen på myfile igen. Denne gang er det sandt.
indrykning
Du vil bemærke, at I if-sætningen ovenfor indrykkede vi de kommandoer, der blev kørt, hvis sætningen var sand., Dette kaldes indrykning og er en vigtig del af at skrive god, ren kode (på ethvert sprog, ikke kun Bash scripts). Målet er at forbedre læsbarheden og gøre det sværere for os at lave enkle, dumme fejl. Der er ikke nogen regler for indrykning i Bash, så du kan indrykke eller ikke indrykke, som du vil, og dine scripts vil stadig køre nøjagtigt det samme. Jeg vil meget anbefale, at du indrykker din kode dog (især da dine scripts bliver større) ellers vil du finde det stadig vanskeligere at se strukturen i dine scripts.,
indlejret hvis udsagn
taler om indrykning. Her er et perfekt eksempel på, hvornår det gør livet lettere for dig. Du kan have så mange hvis udsagn som nødvendigt inde i dit script. Det er også muligt at have en if-erklæring inde i en anden if-erklæring. For eksempel vil vi måske analysere et tal, der er angivet på kommandolinjen som sådan:
lad os bryde det ned:
- linje 4 – Udfør følgende, kun hvis det første kommandolinjeargument er større end 100.
- linje 8-Dette er en let variation på if-sætningen., Hvis vi gerne vil tjekke et udtryk, kan vi bruge dobbeltbeslagene, ligesom vi gjorde for variabler.
- linje 10 – køres kun, hvis begge udsagn er sande.
Yo da .g, jeg besætter dig som if-udsagn, så jeg sætter en if-erklæring inde i din if-erklæring.
(.ibit
((.ibit sagde faktisk ikke det, men jeg er sikker på, at han ville have, hvis han var vært for Pimp My Bash Script.,
Du kan reden så mange hvis udsagn som du vil, men som en generel tommelfingerregel, Hvis du har brug for at reden mere end 3 niveauer dybt, bør du nok tænke på at omorganisere din logik.
hvis ellers
Nogle gange vil vi udføre et bestemt sæt handlinger, hvis en erklæring er sand, og et andet sæt handlinger, hvis det er falsk. Vi kan imødekomme dette med else-mekanismen.,
hvis
derefter
<kommandoer>
andet
<andre kommandoer>
internet
Nu kunne vi nemt læse fra en fil, hvis det er leveret som en command line argument, der ellers læser fra STDIN.
else.sh
- #!/bin/bash
- # andet eksempel
- hvis
- så
- nl $1
- andet
- nl /dev/stdin
- internet
Hvis Elif Andet
Nogle gange kan vi have en række forhold, der kan føre til forskellige stier.,
hvis
derefter
<kommandoer>
elif
derefter
<forskellige kommandoer>
andet
<andre kommandoer>
internet
For eksempel kan det være tilfældet, at hvis du er 18 år eller derover du kan gå til fest. Hvis du ikke er, men du har et brev fra dine forældre, kan du gå, men skal være tilbage før midnat. Ellers kan du ikke gå.
Du kan have så mange elif-grene, som du vil. Den endelige anden er også valgfri.,
Boolske operationer
Nogle gange vil vi kun gøre noget, hvis flere betingelser er opfyldt. Andre gange vil vi gerne udføre handlingen, hvis en af flere betingelser er opfyldt. Vi kan rumme disse med boolske operatører.
- og – &&
- eller – ||
For eksempel måske, at vi kun ønsker at udføre en operation, hvis filen er læsbar og har en størrelse større end nul.
and.sh
- #!,/bin/bash
- # og eksempel
- hvis &&
- så
- echo Denne fil er nyttigt.
- fi
måske vil vi gerne udføre noget lidt anderledes, hvis brugeren enten er bob eller andy.
or.sh
- #!/bin/bash
- # eller eksempel
- hvis ||
- så
- ls -alh
- andet
- ls
- internet
Case Udsagn
Nogle gange kan vi ønske at tage forskellige veje, der er baseret på en variabel matchende en serie af mønstre., Vi kunne bruge en række if og elif udsagn, men det ville snart vokse til at være uvægerligt. Heldigvis er der en sag erklæring, som kan gøre tingene renere., 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
- # case-eksempel
- case – $1 i
- start)
- echo begyndt
- ;;
- stop)
- echo stoping
- ;;
- genstart)
- echo genstart
- ;;
- *)
- echo don\’t know
- ;;
- statistik
Lad os bryde det ned:
- Line 4 – Denne linje begynder casemechanism.
- linje 5 – Hvis $ 1 er lig med ‘start’, skal du udføre de efterfølgende handlinger. den) betyder slutningen af mønsteret.,
- linje 7-vi identificerer slutningen af dette sæt udsagn med en dobbelt semikolon ( ;; ). Efter dette er det næste tilfælde at overveje.
- linje 14-Husk at testen for hvert tilfælde er et mønster. * Repræsenterer et vilkårligt antal tegn. Det er essentialy en fangst alle, hvis for hvis ingen af de andre sager matcher. Det er ikke nødvendigt, men bruges ofte.
- linje 17-esac er tilfældet baglæns og angiver, at vi er i slutningen af sagsangivelsen. Eventuelle andre udsagn efter dette vil blive udført normalt.
- ./case.sh start
- start
- .,/case.sh genstart
- genstart
- ./case.sh bla
- ved ikke
lad os Nu se på et lidt mere kompliceret eksempel, hvor mønstre er brugt en smule mere.
resum if
aktiviteter
lad os nu tage nogle beslutninger.
- Opret et Bash-script, der tager 2 numre som kommandolinjeargumenter. Det vil udskrive til skærmen den største af de to tal.,
- Opret et Bash-script, der accepterer en fil som et kommandolinje-argument og analyserer det på bestemte måder. fx. du kan kontrollere, om filen er eksekverbar eller skrivbar. Du skal udskrive en bestemt besked, hvis sand og en anden, hvis falsk.
- Opret et Bash-script, der udskriver en meddelelse baseret på hvilken ugedag det er (f.eks. ‘Happy hump day’ til Wededensday,’ TGIF ‘ til fredag osv.).