Środowisko programisty/Bash - skrypty złożone: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pan (dyskusja | edycje)
Pan (dyskusja | edycje)
for w stylu C: Pierwsza wersja
Linia 78: Linia 78:


==== for w stylu C ====
==== for w stylu C ====
Bardziej skomplikowana wersja pętli '''for''' w stylu C ma postać:
for ((inicjacja; warunek; post_modyfikacja)); do
  instrukcje
done
'''inicjacja''', '''warunek''' i '''post_modyfikacja''' są wyrażeniami takimi jak wyrażenia używane w konstrukcjach '''$(( ... ))''' i '''(( ... ))'''. Działanie jest następujące.
Na początku i tylko raz, jest uruchamiane wyrażenie '''inicjacja'''. To wyrażenie zazwyczaj ma za zadanie zainicjowanie zmiennych używanych do iterowania pętli.
Następnie przed każdą iteracją wyliczane jest wyrażenie '''warunek'''. Jeśli jest ono fałszywe wykonywanie pętli kończy się. Jeśli jest ono prawdziwe wykonywany jest blok '''instrukcje'''.
Po każdej iteracji wykonywane jest wyrażenie '''post_modyfikacja'''. To wyrażenie zazwyczaj ma za zadanie modyfikacje zmiennych.
Przykład. Kilka sposobów wypisania liczb od 1 do 10:
i=1
while ((i <= 10)); do
  echo -n "$i "
  let "i++"
done
echo
for i in 1 2 3 4 5 6 7 8 9 10; do
  echo -n "$i "
done
echo
for i in `seq 1 10`; do
  echo -n "$i "
done
echo
for ((i = 1; i <= 10; i++)); do
  echo -n "$i "
done
echo
Polecenie '''seq''' służy do generowanie ciągów arytmetycznych.


== Funkcje ==
== Funkcje ==

Wersja z 18:28, 15 sie 2006

Instrukcja wyboru

Pętle

while

Pętla while ma składnię

while warunek; do
  instrukcje
done

Interpreter tak długo wykonuje instrukcje jak długo jest spełniony warunek. Podobnie jak przy instrukcji if, warunek jest poleceniem, które jest uruchamiane przy każdym obrocie pętli. Jeśli status wyjścia jest równy zero, to wykonywane są instrukcje podane w bloku pętli.

Przykład.

zm=""
while [ "$zm" != koniec ]; do
  echo -n "Wpisz coś (słowo 'koniec' aby zakończyć): "
  read zm
  echo "Wpisałeś '$zm'"
done

until

Pętla until jest bardzo podobna do pętli while:

until warunek; do
  instrukcje
done

Różnica polega na tym, ze pętla jest wykonywana tak długo, jak warunek jest nieprawdziwy (przeciwnie do tego jak ma się to w pętli while). Na przykład pętla z poprzedniego przykładu mogła by wyglądać tak:

until [ "$zm" == koniec ]; do
  ...
done

for

Pętla for ma dwie formy. Pierwsza forma służy wykonywania bloku instrukcji dla każdej wartości argumentów z listy, a druga forma ma bardziej złożoną składnię i jest zapożyczona języka C.

for dla list

Ta wersja ma postać:

for zm in lista; do
  instrukcje
done

gdzie lista jest listą wartości. Listę podajemy w analogiczny sposób jak argumenty poleceniu, czyli na przykład możemy uzywać wzorce nazw plików do podania wielu nazw plików naraz. Instrukcję w bloku są wykonywane dla każdej wartości znajdujące się na liście. W danym obrocie wartość z listy przypisywana jest na zmienną zm.

Przykład:

for f in *; do # * rozwija się do listy wszystkich plików/katalogów znajdujących się w bieżącym katalogu
  if [ -d "$f" ]; then
    echo "Katalog '$f'"
  elif [ -f "$f" ]; then
    echo "Plik '$f'"
  else
    echo "Inny typ '$f'"
  fi
done

Listą może być też ciąg wartości. Na przykład, aby wyświetlić kwadraty wybranych liczb możemy te liczby umieścić na liście:

for i in 1 5 100 99; do
  echo "Kwadrat $i = $((i * i))"
done

Listą może też być wynik innego polecenia:

# Wyszukanie wszystkich tych plików o rozszerzeniu txt,
# dla których ostatnia linia zawiera napis "Autor: Jan Kowalski"
for f in `find . -name "*.txt" -type f`; do
  if [ "`tail -1 $f`" == "Autor: Jan Kowalski" ]; then
    echo "Plik '$f' posiada już podpis"
  fi
done

Można także w liście umieścić argumenty skryptu:

# Wypisywanie argumentów skryptu
n=1
for arg in "$@"; do
  echo "Argument $n: '$arg'"
  let "n++"
done

Listę można utworzyć przez połączenie dwóch innych list, na przykład 0 "$@" jest listą skłądającą się z elementu 0 oraz z wszystkich argumentów skryptu.

for w stylu C

Bardziej skomplikowana wersja pętli for w stylu C ma postać:

for ((inicjacja; warunek; post_modyfikacja)); do
  instrukcje
done

inicjacja, warunek i post_modyfikacja są wyrażeniami takimi jak wyrażenia używane w konstrukcjach $(( ... )) i (( ... )). Działanie jest następujące.

Na początku i tylko raz, jest uruchamiane wyrażenie inicjacja. To wyrażenie zazwyczaj ma za zadanie zainicjowanie zmiennych używanych do iterowania pętli.

Następnie przed każdą iteracją wyliczane jest wyrażenie warunek. Jeśli jest ono fałszywe wykonywanie pętli kończy się. Jeśli jest ono prawdziwe wykonywany jest blok instrukcje.

Po każdej iteracji wykonywane jest wyrażenie post_modyfikacja. To wyrażenie zazwyczaj ma za zadanie modyfikacje zmiennych.

Przykład. Kilka sposobów wypisania liczb od 1 do 10:

i=1
while ((i <= 10)); do
  echo -n "$i "
  let "i++"
done
echo

for i in 1 2 3 4 5 6 7 8 9 10; do
  echo -n "$i "
done
echo

for i in `seq 1 10`; do
  echo -n "$i "
done
echo

for ((i = 1; i <= 10; i++)); do
  echo -n "$i "
done
echo

Polecenie seq służy do generowanie ciągów arytmetycznych.

Funkcje

Podshelle

Tablice

Referencje

Pliki specjalne