Tento článek navazuje na sérii článků Bash a zaměřuje se na iterace. Smyčky v Bash jsou užitečné pro každého správce systému a programátora. Smyčkové konstrukce v libovolném skriptovacím jazyce vám umožňují spouštět více příkazů a neustále je spouštět, dokud nedojde ke konkrétní situaci. Jednoduše řečeno, smyčky jsou užitečné pro automatizaci opakujících se úloh. Ve skriptovacím jazyce shellu existují tři smyčkové konstrukce:
- Zatímco -smyčka.
- Pro -smyčka.
- Do -smyčka.
A pro -loop je iterační příkaz v jazyce Bash používaný k provedení sady akcí. Můžete jej použít ve výzvě shellu nebo v rámci samotného skriptu shellu. Pracuje se seznamy položek a opakuje sadu příkazů pro každou položku v seznamu.
Základní syntaxe
Základní syntaxe je uvedena níže:
for item in [LIST]
do
COMMANDS
done
Kde:
- SEZNAM je řada řetězců nebo čísel oddělených mezerami.
- PŘÍKAZY je sada příkazů, které se spouštějí nad seznamem položek.
- pro , v , dělat, a hotovo jsou klíčová slova se syntaxí cyklu.
- položka je název proměnné Bash používaný k získání přístupu k položce ze seznamu.
Opakování čísel
Tento typ smyčky můžete použít k iteraci série čísel nebo číselného seznamu, dokud není seznam vyčerpán.
V následujícím příkladu procházíme čísly 1 2 3 4 5 .
#!/bin/bash
for var in 1 2 3 4 5
do
echo "Number is $var"
done
Měli byste získat následující výstup:
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
Ve výše uvedeném příkladu pro -loop vezme každou položku ze seznamu a uloží je do proměnné var a provádí příkazy mezi do a hotovo .
Můžete také určit rozsah čísel definováním rozsahu hodnot.
V následujícím příkladu iterujeme všechna čísla mezi 10 a 15 .
#!/bin/bash
for var in {10..15}
do
echo "Number is $var"
done
Měli byste získat následující výstup:
Number is 10
Number is 11
Number is 12
Number is 13
Number is 14
Number is 15
Když použijete určitý rozsah v rámci smyčky, můžete také určit přírůstek pro zvýšení každého čísla.
V následujícím příkladu iterujeme přes rozsah čísel od 0 do 10 a každé číslo zvyšte o 2 :
#!/bin/bash
for var in {0..10..2}
do
echo "Number is $var"
done
Měli byste získat následující výstup:
Number is 0
Number is 2
Number is 4
Number is 6
Number is 8
Number is 10
Iterace přes řetězce
Seznam řetězců můžete iterovat také pomocí smyček.
V následujícím příkladu iterujeme seznam řetězců jeden po druhém:
#!/bin/bash
for month in Jan Feb Mar Apr May Jun
do
echo "Month is $month"
done
Měli byste získat následující výstup:
Month is Jan
Month is Feb
Month is Mar
Month is Apr
Month is May
Month is Jun
Iterace přes pole
V následujícím příkladu iterujeme všechny prvky v CARS pole:
#!/bin/bash
CARS=('Maruti' 'Toyota' 'BMW' 'Tata' 'Datsun')
for car in "${CARS[@]}"; do
echo "Car: $car"
done
Měli byste získat následující výstup:
Car: Maruti
Car: Toyota
Car: BMW
Car: Tata
Car: Datsun
V následujícím příkladu pro -loops iteruje všechny prvky v poli pracovních dnů.
#!/bin/bash
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)): $day"
done
Měli byste získat následující výstup:
Weekday 1: Mon
Weekday 2: Tue
Weekday 3: Wed
Weekday 4: Thu
Weekday 5: Fri
Nekonečné smyčky
Pomocí prázdných výrazů můžete vytvořit nekonečnou smyčku.
#!/bin/bash
for (( ; ; ))
do
echo "Infinite Loops [ press CTRL+C to stop]"
done
Měli byste získat následující výstup:
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Můžete stisknout CRTL+C zastavit nekonečnou smyčku.
Prohlášení o přerušení
Můžete použít přestávku příkazem opustit smyčku dříve.
V následujícím příkladu procházíme čísla mezi 20 do 30 . Použijeme pokud -příkaz pro opuštění smyčky, jakmile je aktuální iterovaná položka rovna 27 .
#!/bin/bash
for var in {20..30}
do
if [[ "$var" == '27' ]]; then
break
fi
echo "Number is: $var"
done
Měli byste získat následující výstup:
Number is: 20
Number is: 21
Number is: 22
Number is: 23
Number is: 24
Number is: 25
Number is: 26
Pokračovat ve výpisu
Příkaz continue se používá uvnitř smyček. Když se uvnitř smyčky objeví příkaz continue, řídicí tok přeskočí na začátek smyčky pro další iteraci a přeskočí provádění příkazů v těle smyčky pro aktuální iteraci.
V následujícím příkladu iterujeme čísla mezi 10 do 15 . Když je aktuální iterovaná položka rovna 13 , příkaz continue zastaví provádění, vrátí se na začátek cyklu a pokračuje další iterací:
#!/bin/bash
for var in {10..15}
do
if [[ "$var" == '13' ]]; then
continue
fi
echo "Number is: $var"
done
Měli byste získat následující výstup:
Number is: 10
Number is: 11
Number is: 12
Number is: 14
Number is: 15
Pokročilé příklady
Přejmenovat příponu souboru
Tato část vám ukáže, jak změnit příponu všech souborů v adresáři.
Následující příklad změní příponu všech souborů v aktuálním adresáři z .php na .html .
#!/bin/bash
for file in *.php; do
mv "$file" "${file%.php}.html"
echo $file is renamed to "${file%.php}.html"
done
Měli byste získat následující výstup:
admin.php is converted to admin.html
ajax.php is converted to ajax.html
composer.php is converted to composer.html
index.php is converted to index.html
login.php is converted to login.html
Zobrazit počet zobrazení v řadě
V tomto příkladu zobrazíme aktuální systémový čas každé 2 sekundy.
#!/bin/bash
for now in {1..5}
do
date
sleep 2
done
Měli byste získat následující výstup:
Fri Dec 4 12:19:10 IST 2020
Fri Dec 4 12:19:12 IST 2020
Fri Dec 4 12:19:14 IST 2020
Fri Dec 4 12:19:16 IST 2020
Fri Dec 4 12:19:18 IST 2020
Rozbalit více souborů Tar
Stejnou akci můžete provést u všech souborů se stejnou příponou. Například zrušme tar více souborů v adresáři.
Následující příklad rozbalí všechny soubory tar umístěné v aktuálním adresáři:
#!/bin/bash
for var in *.tar
do
echo "Processing $var..."
tar -xf "$var"
done
Příkaz ping na více serverů
Pomocí smyčkového výrazu můžete pingnout několik serverů ze seznamu.
Nejprve vytvořte soubor s názvem domain.txt a přidejte do tohoto souboru všechny servery, jak je znázorněno níže:
cat domain.txt
Přidejte následující řádky:
google.com
facebook.com
yahoo.com
wordpress.com
Nyní odešleme příkaz ping na všechny servery uvedené v souboru domain.txt, jak je znázorněno níže:
#!/bin/bash
for var in $(cat domain.txt)
do
ping -c 1 "$var"
done
Měli byste získat následující výstup:
PING google.com (216.58.203.14) 56(84) bytes of data.
64 bytes from hkg12s09-in-f14.1e100.net (216.58.203.14): icmp_seq=1 ttl=117 time=119 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.469/119.469/119.469/0.000 ms
PING facebook.com (69.171.250.35) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-01-any2.facebook.com (69.171.250.35): icmp_seq=1 ttl=56 time=43.9 ms
--- facebook.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 43.994/43.994/43.994/0.000 ms
PING yahoo.com (74.6.231.21) 56(84) bytes of data.
64 bytes from media-router-fp74.prod.media.vip.ne1.yahoo.com (74.6.231.21): icmp_seq=1 ttl=51 time=371 ms
--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.135/371.135/371.135/0.000 ms
PING wordpress.com (192.0.78.9) 56(84) bytes of data.
64 bytes from 192.0.78.9: icmp_seq=1 ttl=56 time=40.1 ms
--- wordpress.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 40.162/40.162/40.162/0.000 ms
Vypsat soubory s podmínkami
Zde je příklad ukazující, jak vypsat všechny soubory v konkrétním adresáři, které odpovídají konkrétním podmínkám.
Uveďte například všechny .conf soubory uvnitř /etc adresář, který začíná buď a , b , c nebo d písmena:
#!/bin/bash
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
Seznam všech souborů byste měli získat v následujícím výstupu:
File 1 : /etc/adduser.conf
File 2 : /etc/apg.conf
File 3 : /etc/blkid.conf
File 4 : /etc/brltty.conf
File 5 : /etc/ca-certificates.conf
File 6 : /etc/colord.conf
File 7 : /etc/debconf.conf
File 8 : /etc/deluser.conf
Shrnutí
V tomto článku jsme probrali různé příklady použití Bash pro - smyčky. Doufáme, že nyní máte představu o tom, jak můžete automatizovat své vlastní každodenní úkoly. Pokud byl článek užitečný, pomozte nám jej rozšířit do světa.