Petla For

Pętla for jest jedną z tych rzeczy, która stanowi o potędze Basha - bo nie w każdym języku można iterować po wynikach jakichś komend czy nawet po liniach w pliku.

Iterować
Wykonywać polecenia zawarte wewnątrz pętli, na każdym składniku listy (argumencie).

W Bashu istnieją jej dwie odmiany:

Pętla for podobna do języka C (C like for)

Składnia

for ((<inicjacja_zmiennej>; <warunek_zakonczenia>; <zwiększanie/zmniejszanie>)) ; do
       ...polecenia w pętli...
done

Pętla ta służy do operacji gdzie znamy ilość elementów z których musimy skorzytać lub do policzenia czegoś, wygenerowania liczb:

Przykład

#!/bin/sh

for (( i=1; $i <= 10; i++ )) ; do
       echo " Iteracja nr: $i"
done

Uwaga:

Ta wersja pętli for nie jest dostępna we wszystkich implementacjach Basha można ją częściowo korzystając z polecenia seq.

Przykład

#!/bin/sh

for i in `seq 1 10`
do
       echo "Iteracja nr: $i"
done

Oba skrypty wyprodukują identyczne wyjście:

Iteracja nr: 1
Iteracja nr: 2
Iteracja nr: 3

Iteracja nr: 10

Bardziej bashowa

Inny typ pętli for jest znacznie częściej uzywany, jego składnia przedstawia się następująco:

Składnia

for <zmienna> in <lista> ; do
    zrób_coś
    i_jeszcze_coś
done

<lista> może być łańcuchem znakowym, tablicą lub po prostu listą słów:

Przykład

for x in jeden dwa trzy ; do
    echo "To jest $x"
done

Wynik:

To jest jeden
To jest dwa
To jest trzy

Jak to działa:

Zmiennej x przypisana jest lista, która składa się z trzech elementów: jeden, dwa, trzy. Wartośćią zmiennej x staje się po kolei każdy element listy, na wszystkich wykonywane jest polecenie:

echo "To jest $x".


Pętla for jest bardzo przydatna w sytuacjach, gdy chcemy wykonać jakąś operację na określonym zbiorze plików np na wszystkich plikach w danym katalogu (lub tylko na tych o określonej nazwie).

Przykład - zamiana nazw plików pisanych DUŻYMI literami na nazwy pisane małymi literami: **

#!/bin/bash
for nazwa in * ; do
    mv "$nazwa" `echo "$nazwa" | tr '[A-Z]' '[a-z]'`
done

Za zmianę DUŻYCH liter na małe (i na odwrót) odpowiedzialne jest polecenie tr.
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License