Kõik, mida peate teadma Bash for Loops kohta Linuxis

Kõik, mida peate teadma Bash for Loops kohta Linuxis

Bash -skriptid on väga tõhus viis automatiseerida ülesandeid, eriti neid, mis kasutavad ära teisi olemasolevaid programme. See automatiseerimine nõuab sageli sarnase toimingu kordamist mitu korda, just seal silmuse jaoks tuleb omaette.





Linuxi ja Maci süsteemiadministraatorid on tavaliselt terminali kaudu skriptimisega tuttavad, kuid isegi Windowsi kasutajad saavad seda teha asuge toimingusse Windowsi allsüsteemi Linuxi jaoks .





Kuidas Bash -skriptid toimivad

Bash -skript on lihtsalt tavaline tekstifail, mis sisaldab rea käske, mida bash -shell saab lugeda ja täita. Bash on Catalina-eelses macOS-is ja enamikus Linuxi distributsioonides vaikimisi kasutatav kest.





Kui te pole varem shelliskriptiga töötanud, peaksite alustama absoluutselt lihtsast juhtumist. See võimaldab teil harjutada põhikontseptsioone, sealhulgas skripti loomist ja selle täitmist.

Esmalt looge sobivasse kohta järgmine fail (ideaaljuhul avage terminal ja navigeerige kõigepealt soovitud kataloogi):



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

Esimene rida ütleb, kuidas seda programmi käitada (nt bash -tõlgi abil). Teine on lihtsalt käsk nagu iga teine, mille võite käsureale sisestada. Salvestage see fail nimega tere_maailm.sh , siis:

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

The chmod käsk esimesel real muudab faili käivitatavaks, st seda saab käivitada, sisestades selle nime, nagu teisel real.





Kui näete sõnu Tere, maailm kuvatakse terminali reale trükituna, siis kõik töötab nii nagu vaja.

Kuidas silmused toimivad

Üldises programmeerimises on tsüklit kahte peamist tüüpi: numbriline ja igaühele . Numbriline tüüp on traditsiooniliselt kõige levinum, kuid bashi kasutamisel on see tavaliselt vastupidi.





Ahelate numbrid keskenduvad tavaliselt ühele täisarvule, mis määrab, mitu iteratsiooni läbi viiakse, näiteks:

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

See on tuttava väljanägemisega tsükkel, mis kordub täpselt 100 korda, välja arvatud juhul, kui tsüklit i muudetakse või kui mõni muu avaldus ei muuda for-tsükli täitmist.

Seevastu Foreachi ahelad kipuvad töötama sellistel struktuuridel nagu loendid või massiivid ja kordama iga selle kollektsiooni üksuse kohta:

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

Mõned keeled kasutavad pisut erinevat süntaksi, mis vahetab kogumise ja üksuse järjestuse:

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

Loopides

Bashis, jutlustamine - või eest aastal - silmus on tavalisem. Põhisüntaks on lihtsalt:

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

Näiteks itereerimiseks läbi kolme selgesõnalise nimega faili:

tasuta filmid veebis tasuta, ilma registreerimiseta
for file in one.c two.c three.c
do
ls '$file'
done

Kui praeguses kataloogis on selliseid faile, on selle skripti väljund järgmine:

one.c
two.c
three.c

Fikseeritud failide komplekti asemel saab loendi hankida globaalse mustri abil (üks sisaldab metamärke - erimärke, mis tähistavad teisi märke). Järgmises näites kordab for loop kõiki faile (praeguses kataloogis), mille nimed lõpevad '.xml':

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

Siin on näite väljund:

$ -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

See võib tunduda väga pikaajaline viis:

$ ls -l *.xml

Kuid on märkimisväärne erinevus: for loop täidab ls programm 2 eraldi korda, iga kord edastatakse sellele üks failinimi. Eraldi ls näites sobitab globaalne muster (*.xml) kõigepealt failinimed ja saadab need kõik üksikute käsurea parameetritena ühele eksemplarile ls .

Siin on näide, mis kasutab tualett (sõnade loendamise) programm, et muuta erinevus ilmsemaks:

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

The tualett programm loendab ridade arvu igas failis eraldi, seejärel prindib kõigi nende ridade koguarvu. Seevastu, kui tualett töötab for -loopi piires:

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

Näete endiselt iga faili arvu:

44 feed.xml
231 sitemap.xml

Kuid üldist kokkuvõtet pole, sest tualett käivitatakse isoleeritult, iga kord, kui tsükkel kordub.

Kui loend ei ole loend

Ahelatega tegelemisel on väga lihtne ja levinud viga, mis tuleneb sellest, kuidas bash tsiteeritud argumente/stringe käsitleb. Failide loendi sirvimine peaks toimuma järgmiselt.

for file in one.c two.c

Mitte niimoodi:

for file in 'one.c two.c'

Teine näide sisaldab failinimesid topeltjutumärkides, mille tulemuseks on vaid ühe parameetriga loend; for for käivitatakse ainult üks kord. Sellist probleemi saab vältida muutuja abil:

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

Pange tähele, et muutujadeklaratsioon ise peab oma väärtuse lisama topeltjutumärkidesse!

kuidas eemaldada Wordis lehevahed

Ilma loendita

Kuna midagi pole vaja korrata, töötab for-tsükkel mis tahes käsurea argumentidega, mis skriptile käivitamisel esitati. Näiteks kui teil on skript nimega args.sh mis sisaldab järgmist:

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

Seejärel annab args.sh käivitamine teile järgmise:

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

Bash tunneb selle juhtumi ära ja kohtleb tegemiseks samaväärsena $@ do eest kus $@ on spetsiaalne muutuja, mis esindab käsurea argumente.

Traditsioonilise numbrite jäljendamine silmuse jaoks

Bash -skriptid tegelevad sageli failide loendite või muude käskude väljundiridadega, seega on in -tüüpi tsükkel tavaline. Siiski toetatakse endiselt traditsioonilist c-stiilis toimingut:

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

See on klassikaline vorm, mis koosneb kolmest osast:

  1. muutuja initsialiseeritakse (i = 1) silmuse esmakordsel avastamisel
  2. tsükkel jätkub seni, kuni tingimus (st<=5) is true
  3. iga kord ringis suurendatakse muutujat (i ++)

Kahe väärtuse vahel kordamine on piisavalt levinud nõue, et on olemas lühem, veidi vähem segadust tekitav alternatiiv:

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

Klambrite laiendamine, mis toimub tõhusalt, teisendab ülaltoodud silmuse jaoks järgmiselt:

for i in 1 2 3 4

Peenema silmuse juhtimine katkestamise ja jätkamisega

Silmude jaoks keerukam on sageli vaja võimalust varakult väljuda või kohe taaskäivitada põhiahel järgmise väärtusega. Selleks laenab bash pausi ja jätkab teistes programmeerimiskeeltes levinud avaldusi. Siin on näide, mis kasutab mõlemat, et leida esimene üle 100 tähemärgi pikk fail:

#!/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

Siin kasutatav tsükkel töötab kõigi praeguse kataloogi failidega. Kui fail ei ole tavaline fail (nt kui see on kataloog), kasutatakse jätkamislauset silmuse taaskäivitamiseks järgmise failiga. Kui see on tavaline fail, määrab teine ​​tingimusplokk kindlaks, kas see sisaldab rohkem kui 100 tähemärki. Kui jah, siis kasutatakse lauset break, et kohe tsüklist for lahkuda (ja jõuda skripti lõppu).

Järeldus

Bash -skript on fail, mis sisaldab juhiseid, mida saab täita. A for loop võimaldab skripti osa korrata mitu korda. Muutujate, väliste käskude ning katkestus- ja jätkamislausete abil saavad bash -skriptid rakendada keerukamat loogikat ja täita mitmesuguseid ülesandeid.

Jaga Jaga Piiksuma E -post Kas tasub Windows 11 -le üle minna?

Windows on ümber kujundatud. Kuid kas sellest piisab, et veenda teid Windows 10 -lt Windows 11 -le üle minema?

Loe edasi
Seotud teemad
  • Programmeerimine
  • Linux
Autori kohta Bobby Jack(58 artiklit avaldatud)

Bobby on tehnoloogiahuviline, kes töötas enam kui kaks aastakümmet tarkvaraarendajana. Ta on kirglik mängude vastu, töötab ajakirja Switch Player ülevaadete toimetajana ning on süvenenud kõikidesse veebipõhiste avaldamise ja veebiarenduse aspektidesse.

Veel Bobby Jackilt

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin