Bash-skript er et svært effektivt middel for å automatisere oppgaver, spesielt de som utnytter andre eksisterende programmer. Denne automatiseringen krever ofte å gjenta en lignende operasjon flere ganger, som er nettopp der for løkke kommer til sin rett.
Linux- og Mac-systemadministratorer er vanligvis kjent med skripting via terminalen, men selv Windows-brukere kan gå inn i handlingen med Windows Subsystem for Linux.
Trenger du å bruke Linux ikke tid til å bytte til en annen PC eller kjøre en VM? Kjør Linux i Windows 10 med en Bash shell-terminal i stedet!
Hvordan Bash-skript fungerer
Et bash-skript er ganske enkelt en ren tekstfil som inneholder en rekke kommandoer som bash-skallet kan lese og utføre. Bash er standard skallet i pre-Catalina macOS, og de fleste Linux-distribusjoner.
Hvis du aldri har jobbet med et skallskript før, bør du begynne med det absolutt enkleste tilfellet. Dette vil tillate deg å øve på nøkkelkonsepter, inkludert opprettelse av skriptet og utførelse.
Først oppretter du følgende fil på et praktisk sted (ideelt sett åpner du en terminal og navigerer til ønsket katalog først):
#! / bin / bash
ekko "Hello, World"
Den første linjen forteller hva som kjører dette programmet hvordan du kjører det (dvs. bruker bash-tolk). Den andre er bare en kommando som alle andre du kan skrive inn på kommandolinjen. Lagre filen som hallo_verden.sh, deretter:
$ chmod + x hello_world.sh
$ ./hello_world.sh
De chmod kommandoen på første linje gjør filen kjørbar, noe som betyr at den kan kjøres ved å skrive inn navnet, som i den andre linjen.
Hvis du ser ordene "Hello, World" vises skrevet ut på en linje i terminalen din, fungerer alt etter behov.
Hvordan fungerer løkker
Generell programmering er det to hovedtyper av for loop: numerisk og for hver. Den numeriske typen er tradisjonelt den vanligste, men i bash-bruk er det vanligvis omvendt.
Numerisk for løkker fokuserer vanligvis på et enkelt heltall som bestemmer hvor mange iterasjoner som skal utføres, for eksempel:
for (i = 0; jeg <100; i ++) {
/ * uttalelser å utføre gjentatte ganger * /
}
Dette er en kjent sløyfe som vil iterere nøyaktig 100 ganger, med mindre jeg endres i sløyfen, eller en annen uttalelse fører til at utførelsen av for-sløyfen stopper.
Foreach-løkker, derimot, har en tendens til å operere på strukturer som lister eller matriser, og gjentas for hvert element i samlingen:
folk = ["Peter", "Paul", "Maria"]
foreach (mennesker som person) {
hvis (person == "Paul") {
...
}
}
Noen språk bruker en litt annen syntaks som bytter rekkefølgen på samlingen og varen:
folk = ["Peter", "Paul", "Maria"]
for (person i mennesker) {
hvis (person == "Paul") {
...
}
}
For i Loops
I bash, for forrige — eller for i—Loop er mer vanlig. Den grunnleggende syntaksen er ganske enkelt:
for arg i [liste]
gjøre
/ * uttalelser å utføre gjentatte ganger * /
/ * verdien av arg kan oppnås ved hjelp av $ arg * /
ferdig
For eksempel å gjenta gjennom tre eksplisitt navngitte filer:
for fil i en. c to. c tre. c
gjøre
ls "$ file"
ferdig
Hvis slike filer finnes i den nåværende katalogen, vil utdataene fra dette skriptet være:
one.c
two.c
three.c
I stedet for et fast sett med filer, kan listen fås via et globmønster (ett inkludert jokertegn - spesialtegn som representerer andre tegn). I det følgende eksemplet gjentas for-loop over alle filer (i den gjeldende katalogen) hvis navn ender på ".xml":
for fil i * .xml
gjøre
ls -l "$ file"
ferdig
Her er noen eksempler på eksempler:
$ -rw-r - r-- 1 bobby staff 2436 3. nov 2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27. okt 16:24 sitemap.xml
Dette kan se veldig ut som en langvarig måte å gjøre:
$ ls -l * .xml
Men det er en betydelig forskjell: for loop utfører ls programmer to separate ganger, med et enkelt filnavn sendt til det hver gang. I det separate ls-eksemplet samsvarer globmønsteret (* .xml) først med filnavn og sender dem alle, som individuelle kommandolinjeparametere, til en forekomst av ls.
Her er et eksempel som bruker toalett (ordtelling) program for å gjøre forskjellen mer åpenbar:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 totalt
De toalett programmet teller antall linjer i hver fil separat, og skriver deretter ut et totalt antall på tvers av dem. I kontrast, hvis toalett opererer i en for loop:
for fil i * .xml
gjøre
wc -l $ fil
ferdig
Du ser fremdeles antall for hver fil:
44 feed.xml
231 sitemap.xml
Men det er ingen total oppsummering totalt fordi toalett kjøres isolert, hver gang sløyfen itererer.
Når en liste ikke er en liste
Det er en veldig enkel og vanlig feil når det gjelder løkker, på grunn av måten bash håndterer siterte argumenter / strenger. Å bla gjennom en liste over filer bør gjøres slik:
for fil i en. c to. c
Ikke slik:
for fil i "one.c two.c"
Det andre eksemplet lukker filnavn i dobbelt anførselstegn som resulterer i en liste med bare en enkelt parameter; for loop vil bare kjøres en gang. Dette problemet kan unngås ved å bruke en variabel i slike tilfeller:
FILES = "one.c two.c"
for fil i $ FILES
gjøre
...
ferdig
Vær oppmerksom på at selve variabeldeklarasjonen trenger å legge inn verdien i dobbel anførselstegn!
For Uten en liste
Uten noe å iterere gjennom, fungerer en for loop på de kommandolinjeargumentene som ble gitt til skriptet når de ble påkalt. For eksempel hvis du har et skript som heter args.sh inneholder følgende:
#! / bin / sh
for en
gjøre
ekko $ a
ferdig
Deretter vil kjøring av args.sh gi deg følgende:
$ ./args.sh en to tre
en
to
tre
Bash anerkjenner denne saken og behandler for en gjør som tilsvarer for en i $ @ do hvor $ @ er en spesiell variabel som representerer kommandolinjeargumenter.
Etterligne et tradisjonelt tall for løkke
Bash-skript håndterer ofte lister over filer eller linjer med utdata fra andre kommandoer, slik at for i type loop er vanlig. Imidlertid støttes den tradisjonelle c-stilen fortsatt:
for ((i = 1; jeg <= 5; i ++))
gjøre
ekko $ i
ferdig
Dette er den klassiske formen med tre deler der:
- en variabel initialiseres (i = 1) når løkken først møtes
- sløyfen fortsetter så lenge tilstanden (i <= 5) er sant
- hver gang rundt sløyfen økes variabelen (i ++)
Å skifte mellom to verdier er et vanlig nok krav til at det er et kortere, litt mindre forvirrende alternativ:
for jeg i {1..5}
gjøre
ekko $ i
ferdig
Brace-utvidelsen som foregår effektivt oversetter det ovennevnte for loop til:
for i i 1 2 3 4
Finere sløyfekontroll med pause og fortsett
Mer komplisert for sløyfer trenger ofte en måte å gå ut tidlig eller umiddelbart starte hovedsløyfen på nytt med neste verdi i sving. For å gjøre det, låner bash pausen og fortsetter utsagn som er vanlige i andre programmeringsspråk. Her er et eksempel som bruker begge deler til å finne den første filen som er mer enn 100 tegn lang:
#! / bin / bash
for fil i *
gjøre
hvis [! -f "$ file"]
deretter
ekko "$ -fil er ikke en fil"
Fortsette
fi
num_chars = $ (wc -c echo $ -filen er "$ num_chars tegn lang"
hvis [$ num_chars -gt 100]
deretter
ekko "Fant $ fil"
gå i stykker
fi
ferdig
For loop her fungerer på alle filer i gjeldende katalog. Hvis filen ikke er en vanlig fil (f.eks. Hvis det er en katalog), brukes fortsettelsesuttalelsen for å starte sløyfen på nytt med neste fil i sving. Hvis det er en vanlig fil, vil den andre betingede blokken avgjøre om den inneholder mer enn 100 tegn. I så fall brukes pauseuttrykket til å umiddelbart forlate for-loop (og komme til slutten av skriptet).
Konklusjon
Et bash-skript er en fil som inneholder et sett med instruksjoner som kan utføres. En for loop tillater at en del av et skript gjentas mange ganger. Ved bruk av variabler, eksterne kommandoer og break and continue-setninger kan bash-skript bruke mer kompleks logikk og utføre et bredt spekter av oppgaver.
Rapporten antyder at Apples personvernetiketter for apper kan ha noen problemer.
- Programmering
- Linux
Bobby er en teknologientusiast som jobbet som programvareutvikler i det meste av to tiår. Han brenner for spill, jobber som Reviews Editor i Switch Player Magazine, og er oppslukt av alle aspekter av online publisering og nettutvikling.
Abonner på vårt nyhetsbrev
Bli med på vårt nyhetsbrev for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!
Ett steg til…!
Bekreft e-postadressen din i e-posten vi nettopp sendte deg.