Vše, co potřebujete vědět o Bash For Loops v Linuxu

Vše, co potřebujete vědět o Bash For Loops v Linuxu

Bash skripty jsou vysoce efektivním prostředkem pro automatizaci úloh, zejména těch, které využívají výhod jiných stávajících programů. Tato automatizace často vyžaduje opakování podobné operace několikrát, což je přesně místo, kde pro smyčku přijde na své.





Správci systému Linux a Mac jsou obvykle obeznámeni se skriptováním přes terminál, ale dokonce i uživatelé Windows to umí pusťte se do akce se subsystémem Windows pro Linux .





Jak fungují bash skripty

Skript bash je jednoduše textový soubor obsahující řadu příkazů, které může prostředí bash číst a spouštět. Bash je výchozí shell v macOS před Catalina a ve většině distribucí Linuxu.





Pokud jste nikdy předtím nepracovali s shell skriptem, měli byste začít s absolutně nejjednodušším případem. To vám umožní procvičit klíčové koncepty včetně vytvoření skriptu a jeho spuštění.

Nejprve vytvořte následující soubor na vhodném místě (v ideálním případě otevřete terminál a nejprve přejděte do požadovaného adresáře):



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

První řádek říká, cokoli spouští tento program, jak jej spustit (tj. Pomocí interpret bash). Druhý je jen příkaz jako každý jiný, který můžete zadat na příkazovém řádku. Uložte tento soubor jako ahoj_world.sh , pak:

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

The chmod příkaz na prvním řádku učiní soubor spustitelným, což znamená, že jej lze spustit zadáním jeho názvu, jako na druhém řádku.





Pokud se na řádku ve vašem terminálu zobrazí slova Hello, World, vše funguje podle potřeby.

Jak fungují smyčky

V obecném programování existují dva hlavní typy smyčky for: číselné a pro každého . Číselný typ je tradičně nejběžnější, ale při použití bashe je to obvykle naopak.





Číselné pro smyčky se obvykle zaměřují na jedno celé číslo, které určuje, kolik iterací bude provedeno, například:

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

Jedná se o dobře známou smyčku for, která bude iterovat přesně 100krát, pokud není ve smyčce změněn i nebo jiný příkaz způsobí zastavení provádění smyčky for.

Foreach smyčky mají naopak tendenci fungovat na strukturách, jako jsou seznamy nebo pole, a iterovat pro každou položku v rámci této kolekce:

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

Některé jazyky používají mírně odlišnou syntaxi, která mění pořadí sbírek a položek:

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

Pro ve smyčkách

V bash, foreach - nebo pro v - smyčka je běžnější. Základní syntaxe je jednoduše:

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

Chcete-li například iterovat prostřednictvím tří explicitně pojmenovaných souborů:

co je usb na cestách
for file in one.c two.c three.c
do
ls '$file'
done

Pokud takové soubory v aktuálním adresáři existují, výstup z tohoto skriptu bude:

one.c
two.c
three.c

Místo pevné sady souborů lze seznam získat prostřednictvím globálního vzoru (jeden včetně zástupných znaků - speciální znaky, které představují jiné znaky). V následujícím příkladu smyčka for prochází všemi soubory (v aktuálním adresáři), jejichž názvy končí na '.xml':

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

Zde je příklad 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 vypadat velmi zdlouhavě:

$ ls -l *.xml

Existuje však významný rozdíl: smyčka for provede ls program 2krát, vždy s jedním předaným názvem souboru. V samostatném příkladu ls se vzor glob (*.xml) nejprve shoduje s názvy souborů a poté je odešle jako jednotlivé parametry příkazového řádku do jedné instance ls .

Zde je příklad, který používá toaleta (počet slov) program, aby byl rozdíl jasnější:

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

The toaleta program spočítá počet řádků v každém souboru samostatně a poté vytiskne celkový počet všech. Naproti tomu, pokud toaleta pracuje ve smyčce for:

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

Stále uvidíte počet pro každý soubor:

44 feed.xml
231 sitemap.xml

Neexistuje však celkový souhrn, protože toaleta je spuštěn izolovaně, pokaždé, když se smyčka opakuje.

Když seznam není seznam

Při práci se smyčkami existuje velmi snadná a běžná chyba, protože bash zpracovává citované argumenty/řetězce. Smyčku seznamu souborů je třeba provést takto:

for file in one.c two.c

Tak to ne:

for file in 'one.c two.c'

Druhý příklad uzavírá názvy souborů do uvozovek, jejichž výsledkem je seznam s jediným parametrem; smyčka for se spustí pouze jednou. Tomuto problému se lze vyhnout použitím proměnné v takových případech:

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

Všimněte si, že samotná deklarace proměnné musí uzavřít svou hodnotu do uvozovek!

jak hrát pc hry na android

Bez seznamu

S ničím, co by se mělo opakovat, smyčka for funguje na libovolném argumentu příkazového řádku, který byl skriptu při vyvolání poskytnut. Například pokud máte skript s názvem args.sh obsahující následující:

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

Potom spuštění args.sh vám poskytne následující:

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

Bash tento případ rozpozná a zachází za úkol jako ekvivalent za $@ do kde $@ je speciální proměnná představující argumenty příkazového řádku.

Emulace tradiční číslice pro smyčku

Bash skripty se často zabývají seznamy souborů nebo řádky výstupu z jiných příkazů, takže smyčka typu for in je běžná. Tradiční operace ve stylu c je však stále podporována:

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

Toto je klasický formulář se třemi částmi, ve kterých:

  1. proměnná je inicializována (i = 1), když je smyčka poprvé zjištěna
  2. smyčka pokračuje tak dlouho, dokud podmínka (tj<=5) is true
  3. pokaždé kolem smyčky se proměnná zvýší (i ++)

Iterace mezi dvěma hodnotami je běžným požadavkem, že existuje kratší, o něco méně matoucí alternativa:

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

Rozšíření rovnátka, které probíhá, efektivně překládá výše uvedenou smyčku pro do:

for i in 1 2 3 4

Jemnější ovládání smyčky s přerušením a pokračováním

Složitější pro smyčky často vyžadují způsob předčasného ukončení nebo okamžité restartování hlavní smyčky s další hodnotou v pořadí. Za tímto účelem si bash vypůjčí příkazy break a continue, které jsou běžné v jiných programovacích jazycích. Zde je příklad, který používá oba k nalezení prvního souboru, který má více než 100 znaků:

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

Smyčka for zde funguje na všechny soubory v aktuálním adresáři. Pokud soubor není běžným souborem (např. Pokud je to adresář), příkaz continue se použije k restartování smyčky s dalším souborem v pořadí. Pokud se jedná o běžný soubor, druhý podmíněný blok určí, zda obsahuje více než 100 znaků. Pokud ano, příkaz break slouží k okamžitému opuštění smyčky for (a dosažení konce skriptu).

Závěr

Skript bash je soubor obsahující sadu instrukcí, které lze provést. Smyčka for umožňuje část skriptu opakovat mnohokrát. S využitím proměnných, externích příkazů a příkazů break and continue mohou skripty bash aplikovat složitější logiku a provádět širokou škálu úkolů.

Podíl Podíl tweet E-mailem Vyplatí se upgradovat na Windows 11?

Windows byl přepracován. Stačí to ale k tomu, abyste vás přesvědčili o přechodu z Windows 10 na Windows 11?

Číst dále
Související témata
  • Programování
  • Linux
O autorovi Bobby Jack(58 článků zveřejněno)

Bobby je technologický nadšenec, který pracoval jako vývojář softwaru po téměř dvě desetiletí. Je zapálený pro hraní her, pracuje jako editor recenzí časopisu Switch Player Magazine a je ponořen do všech aspektů online publikování a webového vývoje.

Více od Bobbyho Jacka

Přihlaste se k odběru našeho zpravodaje

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné elektronické knihy a exkluzivní nabídky!

Kliknutím sem se přihlásíte k odběru