Alt du trenger å vite om Bash For Loops i Linux

Alt du trenger å vite om Bash For Loops i Linux

Bash -skript er et svært effektivt middel for å automatisere oppgaver, spesielt de som drar fordel av andre eksisterende programmer. Denne automatiseringen krever ofte at en lignende operasjon gjentas flere ganger, og det er akkurat der for sløyfe kommer til sin rett.





Linux- og Mac -systemadministratorer er vanligvis kjent med skripting via terminalen, men selv Windows -brukere kan gå inn på handlingen med Windows Subsystem for Linux .





Hvordan fungerer Bash -skript

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 skall i pre-Catalina macOS, og de fleste Linux-distribusjoner.





Hvis du aldri har jobbet med et shell -skript før, bør du begynne med den absolutt enkleste saken. Dette lar deg øve på viktige begreper, inkludert opprettelse av manus og utførelse av det.

Opprett først følgende fil på et praktisk sted (ideelt sett åpner du en terminal og navigerer til ønsket katalog først):



#!/bin/bash
echo '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 angi på kommandolinjen. Lagre filen som hello_world.sh , deretter:

$ chmod +x hello_world.sh
$ ./hello_world.sh

De chmod kommandoen på den første linjen gjør filen kjørbar, noe som betyr at den kan kjøres ved å skrive navnet, som på den andre linjen.





Hvis du ser ordene Hello, World vises trykt på en linje i terminalen din, fungerer alt etter behov.

Hvordan for sløyfer fungerer

I generell programmering er det to hovedtyper av for loop: numerisk og for hver . Den numeriske typen er tradisjonelt den vanligste, men ved bash -bruk er det vanligvis omvendt.





Numerisk for sløyfer fokuserer vanligvis på et enkelt heltall som bestemmer hvor mange iterasjoner som skal utføres, for eksempel:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Dette er en kjent løkke som vil gjentas nøyaktig 100 ganger, med mindre i blir endret i løkken, eller en annen uttalelse får kjøringen av for-løkken til å stoppe.

Foreach -løkker, derimot, har en tendens til å operere på strukturer som lister eller matriser, og gjentas for hvert element i samlingen:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Noen språk bruker en litt annen syntaks som bytter rekkefølge for samling og element:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

For i Loops

I bash, foreach - eller for i - løkke er mer vanlig. Den grunnleggende syntaksen er ganske enkelt:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

For eksempel å gjenta gjennom tre eksplisitt navngitte filer:

hva kan jeg gjøre med android auto
for file in one.c two.c three.c
do
ls '$file'
done

Hvis slike filer finnes i den nåværende katalogen, vil utgangen fra dette skriptet være:

one.c
two.c
three.c

I stedet for et fast sett med filer kan listen hentes via et glob -mønster (ett inkludert jokertegn - spesialtegn som representerer andre tegn). I det følgende eksemplet gjentar for -løkken på tvers av alle filer (i den nåværende katalogen) hvis navn ender på '.xml':

for file in *.xml
do
ls -l '$file'
done

Her er noen eksempler på utdata:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Dette kan se veldig ut som en langvarig måte å gjøre:

$ ls -l *.xml

Men det er en signifikant forskjell: for loop utfører ls program 2 separate ganger, med et enkelt filnavn sendt til det hver gang. I det separate ls-eksempelet samsvarer glob-mønsteret (*.xml) med filnavn først 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 total

De toalett programmet teller antall linjer i hver fil separat, og skriver deretter ut et totaltall på tvers av dem. I kontrast, hvis toalett opererer innenfor en for loop:

for file in *.xml
do
wc -l $file
done

Du vil fortsatt se antallet for hver fil:

44 feed.xml
231 sitemap.xml

Men det er ingen samlet oppsummering totalt fordi toalett kjøres isolert, hver gang sløyfen gjentar seg.

Når en liste ikke er en liste

Det er en veldig enkel og vanlig feil når det gjelder sløyfer, på grunn av måten bash håndterer siterte argumenter/strenger på. Sløyfe gjennom en liste over filer bør gjøres slik:

for file in one.c two.c

Ikke slik:

for file in 'one.c two.c'

Det andre eksemplet omslutter filnavn i doble anførselstegn som resulterer i en liste med bare en enkelt parameter; For -løkken vil bare utføres én gang. Dette problemet kan unngås ved å bruke en variabel i slike tilfeller:

FILES='one.c two.c'
for file in $FILES
do
...
done

Vær oppmerksom på at variabelerklæringen i seg selv trenger å inkludere verdien i doble anførselstegn!

Windows kunne ikke automatisk oppdage dette nettverkets proxy -innstillinger.

For Uten liste

Uten noe å gjenta gjennom, opererer en for loop på alle kommandolinjeargumenter som ble gitt til skriptet når de ble påkalt. For eksempel hvis du har et skript som heter args.sh som inneholder følgende:

#!/bin/sh
for a
do
echo $a
done

Deretter vil kjøring av args.sh gi deg følgende:

$ ./args.sh one two three
one
two
three

Bash anerkjenner denne saken og behandler for et gjør som tilsvarer for en i $@ do hvor $@ er en spesiell variabel som representerer kommandolinjeargumenter.

Emulere en tradisjonell numerisk for sløyfe

Bash -skript omhandler ofte lister over filer eller linjer med utdata fra andre kommandoer, så sløyfe for type er vanlig. Den tradisjonelle operasjonen i c-stil støttes imidlertid fortsatt:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Dette er den klassiske formen med tre deler der:

  1. en variabel initialiseres (i = 1) når løkken først oppstår
  2. sløyfen fortsetter så lenge tilstanden (dvs.<=5) is true
  3. hver gang rundt løkken økes variabelen (i ++)

Återere mellom to verdier er et vanlig nok krav til at det er et kortere, litt mindre forvirrende alternativ:

for i in {1..5}
do
echo $i
done

Brace -utvidelsen som finner sted, oversetter effektivt sløyfen ovenfor til:

for i in 1 2 3 4

Finere sløyfekontroll med pause og fortsett

Mer kompleks for sløyfer trenger ofte en måte å gå ut tidlig eller umiddelbart starte hovedsløyfen på nytt med neste verdi i tur og orden. For å gjøre det, låner bash pausen og fortsetter utsagn som er vanlige på andre programmeringsspråk. Her er et eksempel som bruker begge for å finne den første filen som er mer enn 100 tegn lang:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

For -løkken her opererer på alle filene i den nåværende katalogen. Hvis filen ikke er en vanlig fil (f.eks. Hvis det er en katalog), brukes fortsettelseserklæringen for å starte løkken på nytt med neste fil etter tur. Hvis det er en vanlig fil, vil den andre betingede blokken avgjøre om den inneholder mer enn 100 tegn. I så fall brukes break -setningen til å umiddelbart forlate for -løkken (og nå slutten av manuset).

Konklusjon

Et bash -skript er en fil som inneholder et sett med instruksjoner som kan utføres. A for loop gjør at en del av et script kan gjentas mange ganger. Med bruk av variabler, eksterne kommandoer og break and continue -setningene kan bash -skript anvende mer kompleks logikk og utføre et bredt spekter av oppgaver.

Dele Dele kvitring E -post Er det verdt å oppgradere til Windows 11?

Windows har blitt redesignet. Men er det nok til å overbevise deg om å bytte fra Windows 10 til Windows 11?

Les neste
Relaterte temaer
  • Programmering
  • Linux
Om forfatteren Bobby Jack(58 artikler publisert)

Bobby er en teknologientusiast som jobbet som programvareutvikler i de fleste to tiårene. Han brenner for spill, jobber som Reviews Editor i Switch Player Magazine, og er fordypet i alle aspekter av online publisering og webutvikling.

Mer fra Bobby Jack

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere