Všetko, čo potrebujete vedieť o Bash For Loops v Linuxe

Všetko, čo potrebujete vedieť o Bash For Loops v Linuxe

Bash skripty sú vysoko efektívnym prostriedkom na automatizáciu úloh, najmä tých, ktoré využívajú výhody iných existujúcich programov. Táto automatizácia často vyžaduje opakovanie podobnej operácie niekoľkokrát, presne na mieste pre slučku príde na svoje.





Správcovia systému Linux a Mac sú zvyčajne oboznámení so skriptovaním pomocou terminálu, ale dokonca aj používatelia systému Windows to zvládajú pustite sa do akcie so subsystémom Windows pre Linux .





Ako fungujú bash skripty

Bash skript je jednoducho textový súbor obsahujúci sériu príkazov, ktoré môže bash shell čítať a vykonávať. Bash je predvolený shell v systéme macOS pred Catalina a vo väčšine distribúcií Linuxu.





Ak ste so skriptom shell nikdy predtým nepracovali, mali by ste začať s úplne najjednoduchším prípadom. To vám umožní precvičiť kľúčové pojmy vrátane vytvorenia skriptu a jeho spustenia.

Najprv vytvorte nasledujúci súbor na vhodnom mieste (v ideálnom prípade otvorte terminál a najskôr prejdite do požadovaného adresára):



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

Prvý riadok hovorí, bez ohľadu na to, akým spôsobom je tento program spustený, ako ho spustiť (t. J. Pomocou interpreta bash). Druhý je len príkaz ako každý iný, ktorý by ste mohli zadať na príkazovom riadku. Uložte tento súbor ako ahoj_world.sh , potom:

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

The chmod príkaz na prvom riadku urobí súbor spustiteľným, to znamená, že ho možno spustiť zadaním jeho názvu, ako v druhom riadku.





Ak sa vám na riadku vo vašom termináli zobrazia slová Dobrý deň, svet je vytlačený, potom všetko funguje, ako má.

Ako fungujú slučky

Vo všeobecnom programovaní existujú dva hlavné typy slučky for: číselné a pre každý . Číselný typ je tradične najbežnejší, ale pri použití bashu je to zvyčajne naopak.





Číselné hodnoty pre slučky sa zvyčajne zameriavajú na jedno celé číslo, ktoré určuje, koľko iterácií sa vykoná, napríklad:

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

Toto je dobre vyzerajúca slučka for, ktorá sa bude iterovať presne 100 krát, pokiaľ nie je v rámci cyklu zmenená hodnota i alebo ak iný príkaz nespôsobí zastavenie vykonávania slučky for.

Foreach smyčky naopak fungujú na základe štruktúr, ako sú zoznamy alebo polia, a opakujú pre každú položku v rámci tejto kolekcie:

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

Niektoré jazyky používajú mierne odlišnú syntax, ktorá mení poradie zbierky a položky:

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

Pre v slučkách

V bash, foreach - alebo pre v - slučka je bežnejšia. Základná syntax je jednoduchá:

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

Napríklad na iteráciu prostredníctvom troch explicitne pomenovaných súborov:

poštová aplikácia Windows 10 vs Outlook
for file in one.c two.c three.c
do
ls '$file'
done

Ak také súbory existujú v aktuálnom adresári, výstup z tohto skriptu bude:

one.c
two.c
three.c

Namiesto pevnej sady súborov je možné zoznam získať prostredníctvom globálneho vzoru (jeden vrátane zástupných znakov - špeciálne znaky, ktoré predstavujú iné znaky). V nasledujúcom príklade slučka for opakuje všetky súbory (v aktuálnom adresári), ktorých názvy končia na „.xml“:

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

Tu je niekoľko príkladov výstupu:

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

Môže to vyzerať veľmi zdĺhavo:

$ ls -l *.xml

Existuje však podstatný rozdiel: slučka for vykoná ls program 2 -krát, pričom mu bude zakaždým odovzdaný jeden názov súboru. V samostatnom príklade ls sa vzor glob (*.xml) najskôr zhoduje s názvami súborov a potom ich všetky odošle ako jednotlivé parametre príkazového riadka do jednej inštancie ls .

Tu je príklad, ktorý používa wc program (počet slov), aby bol rozdiel evidentnejší:

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

The wc program spočíta počet riadkov v každom súbore zvlášť a potom vytlačí celkový počet riadkov pre všetky. Naproti tomu, ak wc funguje v slučke for:

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

Stále uvidíte počet pre každý súbor:

44 feed.xml
231 sitemap.xml

Neexistuje však celkový súhrn, pretože wc sa spúšťa izolovane, zakaždým, keď sa slučka opakuje.

Keď zoznam nie je zoznam

Pri riešení slučiek existuje veľmi jednoduchá a bežná chyba, pretože bash zaobchádza s citovanými argumentmi/reťazcami. Opakovanie zoznamu súborov by sa malo vykonať takto:

for file in one.c two.c

Nie takto:

for file in 'one.c two.c'

Druhý príklad uzatvára názvy súborov do dvojitých úvodzoviek, ktorých výsledkom je zoznam s jediným parametrom; slučka for sa spustí iba raz. Tomuto problému sa dá vyhnúť použitím premennej v týchto prípadoch:

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

Všimnite si toho, že samotná deklarácia premennej musí svoju hodnotu uzavrieť do úvodzoviek!

ako urýchliť nabíjanie telefónu

Bez zoznamu

Pretože nemá čo opakovať, slučka for funguje na základe akýchkoľvek argumentov príkazového riadka, ktoré boli skriptu pri spustení poskytnuté. Ak máte napríklad skript s názvom args.sh obsahujúci nasledujúce:

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

Potom spustením args.sh získate nasledujúce:

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

Bash tento prípad pozná a zaobchádza za úlohu ako ekvivalent za $@ do kde $@ je špeciálna premenná predstavujúca argumenty príkazového riadka.

Emulácia tradičného čísla pre slučku

Bash skripty sa často zaoberajú zoznammi súborov alebo riadkami výstupu z iných príkazov, takže cyklus for in je bežný. Tradičná operácia v štýle c je však stále podporovaná:

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

Toto je klasická forma s tromi časťami, v ktorých:

  1. premenná sa inicializuje (i = 1) pri prvom stretnutí so slučkou
  2. slučka pokračuje tak dlho, ako podmienka (t.j.<=5) is true
  3. zakaždým okolo cyklu sa premenná zvýši (i ++)

Iterácia medzi dvoma hodnotami je dostatočne bežnou požiadavkou, aby existovala kratšia, o niečo menej mätúca alternatíva:

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

Rozšírenie vzpery, ktoré prebieha, efektívne prekladá vyššie uvedenú slučku for do:

for i in 1 2 3 4

Jemnejšie ovládanie slučky s prerušením a pokračovaním

Zložitejšie pre slučky často vyžadujú spôsob predčasného ukončenia alebo okamžité reštartovanie hlavnej slučky s ďalšou hodnotou v poradí. Za týmto účelom si bash požičiava príkazy na prestávku a pokračuje, ktoré sú bežné v iných programovacích jazykoch. Tu je príklad, ktorý používa obidva na nájdenie prvého súboru, ktorý má viac ako 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

Cyklus for tu funguje so všetkými súbormi v aktuálnom adresári. Ak súbor nie je bežným súborom (napr. Ak je to adresár), príkaz continue sa použije na reštartovanie cyklu s ďalším súborom. Ak ide o bežný súbor, druhý podmienený blok určí, či obsahuje viac ako 100 znakov. Ak je to tak, príkaz break sa použije na okamžité opustenie cyklu for (a dosiahnutie konca skriptu).

Záver

Bash skript je súbor obsahujúci sadu pokynov, ktoré je možné vykonať. Cyklus for umožňuje, aby sa časť skriptu opakovala mnohokrát. S použitím premenných, externých príkazov a príkazov break a continue môžu skripty bash používať komplexnejšiu logiku a vykonávať celý rad úloh.

zdieľam zdieľam Tweet E -mail Oplatí sa upgradovať na Windows 11?

Windows bol prepracovaný. Stačí to však na to, aby ste sa presvedčili o prechode z Windows 10 na Windows 11?

Čítajte ďalej
Súvisiace témy
  • Programovanie
  • Linux
O autorovi Bobby Jack(58 publikovaných článkov)

Bobby je technologický nadšenec, ktorý pracoval ako vývojár softvéru väčšinu dvoch desaťročí. Má nadšenie pre hry, pracuje ako editor recenzií v časopise Switch Player a je ponorený do všetkých aspektov online publikovania a webového vývoja.

Viac od Bobbyho Jacka

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné elektronické knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber