Alt hvad du behøver at vide om Bash For Loops i Linux

Alt hvad du behøver at vide om Bash For Loops i Linux

Bash -scripts er et yderst effektivt middel til automatisering af opgaver, især dem, der drager fordel af andre eksisterende programmer. Denne automatisering kræver ofte, at en lignende operation gentages flere gange, hvilket er præcis, hvor til sløjfe kommer til sin ret.





Linux- og Mac -systemadministratorer kender typisk scripting via terminalen, men det kan selv Windows -brugere kom ind på handlingen med Windows Subsystem til Linux .





Sådan fungerer Bash -scripts

Et bash -script er simpelthen en almindelig tekstfil, der indeholder en række kommandoer, som bash -shell kan læse og udføre. Bash er standardskallen i pre-Catalina macOS og de fleste Linux-distributioner.





Hvis du aldrig har arbejdet med et shell -script før, skal du begynde med den absolut enkleste sag. Dette giver dig mulighed for at øve vigtige begreber, herunder oprettelse af scriptet og dets udførelse.

Opret først følgende fil på en bekvem placering (ideelt åbner du en terminal og navigerer først til det ønskede bibliotek):



#!/bin/bash
echo 'Hello, World'

Den første linje fortæller, uanset hvad der kører dette program, hvordan det køres (dvs. ved hjælp af bash -tolken). Den anden er bare en kommando som enhver anden, du måtte indtaste på kommandolinjen. Gem filen som hej_verden.sh , derefter:

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

Det chmod kommando på den første linje gør filen eksekverbar, hvilket betyder, at den kan køres ved at indtaste dens navn, som i den anden linje.





Hvis du ser ordene Hej, verden vises trykt på en linje i din terminal, fungerer alt efter behov.

Sådan fungerer loops

I generel programmering er der to hovedtyper af for loop: numerisk og for hver . Den numeriske type er traditionelt den mest almindelige, men i bash -brug er det normalt omvendt.





Numerisk for sløjfer fokuserer typisk på et enkelt heltal, der bestemmer, hvor mange iterationer der skal udføres, for eksempel:

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

Dette er en velkendt søgerløkke, der gentager nøjagtigt 100 gange, medmindre i ændres i sløjfen, eller en anden erklæring får udførelsen af ​​for-løkken til at standse.

Foreach -sløjfer har derimod en tendens til at fungere på strukturer som lister eller arrays og gentages for hvert element i den samling:

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

Nogle sprog bruger en lidt anden syntaks, der bytter rækkefølgen af ​​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 mere almindelig. Den grundlæggende syntaks er ganske enkelt:

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

For eksempel at gentage gennem tre eksplicit navngivne filer:

fede ting at lave med en projektor
for file in one.c two.c three.c
do
ls '$file'
done

Hvis der findes sådanne filer i det aktuelle bibliotek, vil output fra dette script være:

one.c
two.c
three.c

I stedet for et fast sæt filer kan listen hentes via et glob -mønster (et inklusive jokertegn - specialtegn, der repræsenterer andre tegn). I det følgende eksempel gentages for -loop på tværs af alle filer (i det aktuelle bibliotek), hvis navne ender på '.xml':

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

Her er nogle eksempler på output:

$ -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 meget gerne ligne en langvarig måde at gøre:

$ ls -l *.xml

Men der er en væsentlig forskel: for -loop udfører ls program 2 separate gange, med et enkelt filnavn videregivet til det hver gang. I det separate ls-eksempel matcher globmønsteret (*.xml) først filnavne og sender dem alle som individuelle kommandolinjeparametre til en forekomst af ls .

Her er et eksempel, der bruger Toilet (ordtælling) program for at gøre forskellen mere indlysende:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

Det Toilet program tæller antallet af linjer i hver fil separat, og udskriver derefter et samlet antal på tværs af dem alle. I modsætning hertil, hvis Toilet fungerer inden for en for loop:

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

Du kan stadig se antallet for hver fil:

44 feed.xml
231 sitemap.xml

Men der er ingen samlet summarisk total pga Toilet køres isoleret, hver gang loopet gentages.

Når en liste ikke er en liste

Der er en meget let og almindelig fejl, når der skal arbejdes med sløjfer, på grund af den måde, bash håndterer citerede argumenter/strenge på. Looping gennem en liste over filer skal gøres sådan:

for file in one.c two.c

Ikke sådan her:

for file in 'one.c two.c'

Det andet eksempel omslutter filnavne i dobbelte anførselstegn, hvilket resulterer i en liste med kun en enkelt parameter; For -løkken udføres kun én gang. Dette problem kan undgås ved at bruge en variabel i sådanne tilfælde:

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

Bemærk, at selve variabelerklæringen skal indeholde dens værdi i dobbelte anførselstegn!

windows 10 sidder fast i reparationssløjfe

For uden en liste

Uden noget at iterere igennem fungerer en for loop på de kommandolinjeargumenter, der blev leveret til scriptet, når de blev påkaldt. For eksempel, hvis du har et script navngivet args.sh indeholdende følgende:

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

Derefter giver eksekvering af args.sh dig følgende:

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

Bash genkender denne sag og behandler for et gør som ækvivalent til for en i $@ do hvor $@ er en særlig variabel, der repræsenterer kommandolinjeargumenter.

Emulering af en traditionel numerisk til sløjfe

Bash -scripts beskæftiger sig ofte med lister over filer eller outputlinjer fra andre kommandoer, så loop -typen er almindelig. Den traditionelle c-stil operation understøttes dog stadig:

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

Dette er den klassiske form med tre dele, hvor:

  1. en variabel initialiseres (i = 1), når løkken første gang stødes på
  2. sløjfen fortsætter, så længe tilstanden (i<=5) is true
  3. hver gang omkring løkken øges variablen (i ++)

Atterere mellem to værdier er et almindeligt nok krav til, at der er et kortere, lidt mindre forvirrende alternativ:

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

Brace -udvidelsen, der finder sted, oversætter effektivt ovenstående for loop til:

for i in 1 2 3 4

Finere sløjfe kontrol med pause og fortsæt

Mere kompleks for sløjfer har ofte brug for en måde at forlade tidligt på eller straks genstarte hovedsløjfen med den næste værdi på skift. For at gøre det låner bash pausen og fortsætter udsagn, der er almindelige i andre programmeringssprog. Her er et eksempel, der bruger begge til at finde den første fil, der er mere end 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 -loop fungerer her på alle filer i det aktuelle bibliotek. Hvis filen ikke er en almindelig fil (f.eks. Hvis det er et bibliotek), bruges fortsætningssætningen til at genstarte sløjfen med den næste fil efter tur. Hvis det er en almindelig fil, vil den anden betingede blok afgøre, om den indeholder mere end 100 tegn. I så fald bruges break -sætningen til straks at forlade for -loop (og nå slutningen af ​​scriptet).

Konklusion

Et bash -script er en fil, der indeholder et sæt instruktioner, der kan udføres. A for loop gør det muligt at gentage en del af et script mange gange. Ved brug af variabler, eksterne kommandoer og break and continue -sætninger kan bash -scripts anvende mere kompleks logik og udføre en lang række opgaver.

Del Del Tweet E -mail Er det værd at opgradere til Windows 11?

Windows er blevet redesignet. Men er det nok til at overbevise dig om at skifte fra Windows 10 til Windows 11?

Læs Næste
Relaterede emner
  • Programmering
  • Linux
Om forfatteren Bobby Jack(58 artikler udgivet)

Bobby er en teknologientusiast, der arbejdede som softwareudvikler i det meste af to årtier. Han brænder for spil, arbejder som Reviews Editor hos Switch Player Magazine og er nedsænket i alle aspekter af onlineudgivelse og webudvikling.

Mere fra Bobby Jack

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere