Vse, kar morate vedeti o Bash For Loops v Linuxu

Vse, kar morate vedeti o Bash For Loops v Linuxu

Bash skripti so zelo učinkovito sredstvo za avtomatizacijo opravil, zlasti tistih, ki izkoriščajo druge obstoječe programe. Ta avtomatizacija pogosto zahteva večkrat ponovitev podobne operacije, kar je točno tam, kjer je za zanko pride na svoje.





Sistemski skrbniki Linuxa in Maca so običajno seznanjeni s skriptiranjem prek terminala, vendar lahko tudi uporabniki sistema Windows začnite ukrepati s podsistemom Windows za Linux .





Kako delujejo skripti Bash

Bash skript je preprosto navadna besedilna datoteka, ki vsebuje vrsto ukazov, ki jih lupina bash lahko prebere in izvede. Bash je privzeta lupina v macOS-u pred Catalino in večini distribucij Linuxa.





Če še nikoli niste delali s skriptom lupine, morate začeti z najpreprostejšim primerom. Tako boste lahko vadili ključne koncepte, vključno z ustvarjanjem skripta in njegovo izvedbo.

Najprej ustvarite naslednjo datoteko na priročnem mestu (v idealnem primeru odprite terminal in se najprej pomaknite do želenega imenika):



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

Prva vrstica pove vse, kar izvaja ta program, kako ga zagnati (tj. Z uporabo tolmača bash). Drugi je samo ukaz, ki ga lahko vnesete v ukazno vrstico. Shranite to datoteko kot hello_world.sh , potem:

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

The chmod ukaz v prvi vrstici naredi datoteko izvedljivo, kar pomeni, da jo lahko zaženete tako, da vnesete njeno ime, kot v drugi vrstici.





Če vidite besede Hello, World natisnjene na vrstici v vašem terminalu, potem vse deluje po potrebi.

Kako delujejo zanke

V splošnem programiranju obstajata dve glavni vrsti zanke for: numerično in za vsakogar . Številčna vrsta je tradicionalno najpogostejša, pri bash uporabi pa je običajno obratno.





Številčne zanke se običajno osredotočajo na eno celo število, ki določa, koliko ponovitev bo izvedenih, na primer:

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

To je znana zanka, ki se bo ponavljala natanko 100-krat, razen če se i spremeni znotraj zanke, ali pa drug stavek povzroči zaustavitev izvajanja zanke for.

Nasprotno pa zanke Foreach delujejo na strukturah, kot so seznami ali matrike, in ponavljajo za vsak element v tej zbirki:

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

Nekateri jeziki uporabljajo nekoliko drugačno skladnjo, ki zamenja vrstni red zbiranja in postavke:

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

Za v zankah

V bash, foreach - oz za v - zanka je pogostejša. Osnovna skladnja je preprosto:

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

Na primer za ponovitev treh eksplicitno poimenovanih datotek:

kako odprem datoteko a.dat
for file in one.c two.c three.c
do
ls '$file'
done

Če takšne datoteke obstajajo v trenutnem imeniku, bo izhod iz tega skripta:

one.c
two.c
three.c

Namesto s fiksnim naborom datotek je seznam mogoče pridobiti prek globinskega vzorca (enega, ki vključuje nadomestne znake - posebne znake, ki predstavljajo druge znake). V naslednjem primeru zanka for ponavlja vse datoteke (v trenutnem imeniku), katerih imena se končajo z '.xml':

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

Tu je nekaj primerov izhoda:

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

To je lahko zelo podobno dolgočasnemu načinu dela:

$ ls -l *.xml

Obstaja pa pomembna razlika: zanka for izvede datoteko ls program dvakrat, pri čemer mu je vsakič posredovano eno ime datoteke. V ločenem primeru ls se vzorec glob (*.xml) najprej ujema z imeni datotek, nato pa jih vse pošlje kot posamezne parametre ukazne vrstice v en primerek ls .

Tukaj je primer, ki uporablja stranišče (štetje besed) program, ki naredi razliko bolj očitno:

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

The stranišče program šteje število vrstic v vsaki datoteki posebej, nato pa natisne skupno število vseh vrstic. Nasprotno, če stranišče deluje znotraj for zanke:

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

Število za vsako datoteko bo še vedno prikazano:

44 feed.xml
231 sitemap.xml

Vendar ni skupnega povzetka, ker stranišče se izvaja ločeno, vsakič, ko se zanka ponovi.

Kadar seznam ni seznam

Pri ravnanju z zankami je zelo preprosta in pogosta napaka zaradi načina, kako bash obravnava citirane argumente/nize. Prelistavanje seznama datotek je treba narediti tako:

for file in one.c two.c

Ne takole:

for file in 'one.c two.c'

Drugi primer vsebuje imena datotek v dvojne narekovaje, kar ima za posledico seznam samo z enim parametrom; zanka for se bo izvedla samo enkrat. Temu problemu se je mogoče izogniti z uporabo spremenljivke v takih primerih:

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

Upoštevajte, da mora sama deklaracija spremenljivke svojo vrednost vključiti v dvojne narekovaje!

ali lahko povežete airpods z xbox one

Za brez seznama

Ker ni možnosti za ponovitev, zanka for deluje na vseh argumentih ukazne vrstice, ki so bili skriptu posredovani ob klicu. Na primer, če imate skript z imenom args.sh ki vsebuje naslednje:

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

Izvajanje args.sh vam bo dalo naslednje:

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

Bash prepozna ta primer in ga obravnava za nalogo kot ekvivalent za $@ do kjer je $@ posebna spremenljivka, ki predstavlja argumente ukazne vrstice.

Posnemanje tradicionalne številke za zanko

Bash skripti pogosto obravnavajo sezname datotek ali vrstice izhodov iz drugih ukazov, zato je zanka for in pogosta. Vendar je tradicionalna operacija v slogu c še vedno podprta:

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

To je klasična oblika s tremi deli, v katerih:

  1. spremenljivka se inicializira (i = 1), ko prvič naletimo na zanko
  2. zanka se nadaljuje, dokler je pogoj (tj<=5) is true
  3. vsakič v zanki se spremenljivka poveča (i ++)

Iteracija med dvema vrednostma je dovolj pogosta zahteva, da obstaja krajša, nekoliko manj zmedena alternativa:

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

Razširitev naramnic, ki poteka, učinkovito prevede zgornjo for zanko v:

for i in 1 2 3 4

Finer Loop Control with Break in Nadaljuj

Kompleksnejše zanke pogosto potrebujejo način za zgodnji izhod ali takojšen ponovni zagon glavne zanke z naslednjo vrednostjo. Če želite to narediti, si bash sposodi stavke break in continue, ki so običajni v drugih programskih jezikih. Tukaj je primer, ki uporablja oboje za iskanje prve datoteke, ki je dolga več kot 100 znakov:

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

Zanka for tukaj deluje na vseh datotekah v trenutnem imeniku. Če datoteka ni navadna (na primer, če je imenik), se stavek continue uporabi za ponovni zagon zanke z naslednjo datoteko. Če gre za običajno datoteko, bo drugi pogojni blok določil, ali vsebuje več kot 100 znakov. Če je tako, se stavek break uporabi za takojšen izhod iz zanke for (in doseganje konca skripta).

Zaključek

Bash skript je datoteka, ki vsebuje niz navodil, ki jih je mogoče izvesti. Zanka for omogoča večkrat ponovitev dela skripta. Z uporabo spremenljivk, zunanjih ukazov in stavkov break and continue lahko bash skripti uporabijo bolj zapleteno logiko in izvajajo širok spekter nalog.

Deliti Deliti Cvrkutati E-naslov Ali je vredno nadgraditi na Windows 11?

Windows je bil preoblikovan. Toda ali je to dovolj, da vas prepriča, da preidete z operacijskega sistema Windows 10 na Windows 11?

Preberite Naprej
Sorodne teme
  • Programiranje
  • Linux
O avtorju Bobby Jack(58 objavljenih člankov)

Bobby je tehnološki navdušenec, ki je več kot dve desetletji delal kot razvijalec programske opreme. Navdušen je nad igranjem iger, dela kot urednik recenzij v reviji Switch Player in je potopljen v vse vidike spletnega založništva in spletnega razvoja.

Več od Bobbyja Jacka

Naročite se na naše novice

Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e -knjige in ekskluzivne ponudbe!

Kliknite tukaj, da se naročite