GNU/Linux >> Znalost Linux >  >> Linux

Bash For Loop – nejpraktičtější průvodce

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.

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.
  • provdělat,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 dohotovo .

Můžete také určit rozsah čísel definováním rozsahu hodnot.

V následujícím příkladu iterujeme všechna čísla mezi 1015 .

#!/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ď abc 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.


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Bash for smyčky Příklady

  3. Jak získat stav ukončení smyčky v bash

  1. Průvodce linuxovým terminálem pro začátečníky

  2. Paralelizovat Bash For Loop?

  3. Praktický limit na počet snímků Btrfs?

  1. The Bash ‘?

  2. Příklady Bash for Loop a While Loop

  3. Udržujeme vás ve smyčce – příklady opakování pro, Zatímco, dokud