Pętla 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ć czyli 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

Ostrzeżenie

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

Podpowiedź

Czy zauwazyłeś, że w powyższym przykładzie nie ma średnika? Programista basha ma do wyboru, albo umieścić średnik przed slowem do, albo zacząć słowo do od nowej linii.

Nie jest to intuicyjne i jest czasem powodem występowania dziwnych błedów w skrypcie (dlatego zwracamy na to uwagę).

Oba skrypty wyprodukują identyczne wyjście:

>> Iteracja nr: 1
>> Iteracja nr: 2
>> Iteracja nr: 3
>> ...
>> Iteracja nr: 10

Pętla for w stylu Bash

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:

  1. 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".
  1. 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.