Programowanie w Shellu (index)


Programowanie w Shellu (5) - konstrukcje iteracyjne

ZADANIE 5.1

Stworzyć plik make_old.sh postaci:


#!/bin/bash
#
# make_old.sh
#
# Przyklad przetwarzania plikow w danym katalogu.
# Wykorzystanie metaznakow i zmiennej specjalnej $0
# zawierajacej nazwe skryptu.

# for I in *
for I in *.txt
do
    echo "$0: Przetwarzam plik $I ..."
    cp $I $I.old
done
exit 0

Uruchomić skrypt poleceniem: ./make_old.sh

ZADANIE 5.2

Stworzyć plik tabela.sh postaci:


#!/bin/bash
#
# tabela.sh
#
# Wypisanie tabeli liczb.
# Wykorzystanie mechanizmu rozwijania nawiasow w bash.

for I in {0,1,2,3,4,5,6,7,8,9}
do
    for J in {0,1,2,3,4,5,6,7,8,9}
    do
        echo -n "$I$J  "
    done
    echo
done
exit 0

Przygotować pliki z rozszerzeniem .txt, np. poleceniem: touch {p1,p2,p3}.txt

Uruchomić skrypt poleceniem: ./tabela.sh

ZADANIE 5.3

Stworzyć plik gwiazdy.sh postaci:


#!/bin/bash
#
# gwiazdy.sh
#
# Wypisuje piramide gwiazdek.
# Wykorzystanie petli "while".

GWIAZDY="*"
NIEBO="*******************"
# Powtarzaj dopoki warunek jest prawdziwy
while [ "${GWIAZDY}" != "${NIEBO}" ]
do
    echo "${GWIAZDY}"
# Sukcesywnie wydluzamy napis przechowywany w zmiennej.
    GWIAZDY=${GWIAZDY}"*"
done
exit 0

Uruchomić skrypt poleceniem: ./gwiazdy.sh

ZADANIE 5.4

Stworzyć plik licznik.sh postaci:


#!/bin/bash
#
# licznik.sh
#
# Wypisuje liczby naturalne od 1 do ${KONIEC}.
# Wykorzystanie petli while i zmiennej LICZNIK do sterowania.

START=1
KONIEC=15
echo "Liczby naturalne nie wieksze od ${KONIEC}:"
LICZNIK=${START}
while [ ${LICZNIK} -le ${KONIEC} ]
do
    echo ${LICZNIK}
    let "LICZNIK=LICZNIK+1"
done
exit 0

Uruchomić skrypt poleceniem: ./licznik.sh

Poprawić skrypt, aby wypisywał liczby całkowite od START do KONIEC, gdzie granice zostaną podane przez użytkownika. Dodać sprawdzenie, czy START jest mniejszy niż KONIEC.

INSTRUKCJA FOR-DO-DONE


for ZMIENNA in wartosc1 wartosc2 ...
do
    lista_poleceń             (tu użyjemy ${ZMIENNA})
done

Można przetwarzać pliki w katalogu:

for PLIK in * ; do lista_poleceń ; done

for PLIK in plik* ; do lista_poleceń ; done

for PLIK in plik{1,2,3,4,5,6,7,8} ; do lista_poleceń ; done

for I in $(rpm -qa) ; do lista_poleceń ; done

Można przeadresować wyjście całego polecenia for:

for PLIK in * ; do lista_poleceń ; done >> komunikaty.txt

for PLIK in * ; do lista_poleceń ; done | wc > liczba.txt

for ZMIENNA do lista_poleceń ; done
oznacza 
for ZMIENNA in "$@" ; do lista_poleceń ; done
         (ciąg argumentów przekazanych do skryptu)

INSTRUKCJA WHILE-DO-DONE


while polecenie               (dopóki prawda, czyli kod powrotu 0)
do                            (powtarzaj)
    lista_poleceń
done

while polecenie ; do lista_poleceń ; done

Przykład ustalenia poprawnej nazwy istniejacego pliku:

while [ t ]         (każda stała to prawda, czyli pętla nieskończona)
do
    echo "Podaj nazwe pliku: "
    read FILENAME                       (wczytanie nazwy)
    if [ -r ${FILENAME} ]; then
        echo "Nazwa pliku poprawna"
        break
    fi
done

Przykład przetwarzania zawartości plików:

for PLIK in *.txt
do
    cat ${PLIK} | while read LINE       (czytaj wiersz)
    do
        przetwarzaj ${LINE}
    done
done

INSTRUKCJA UNTIL-DO-DONE


until polecenie1              (powtarzaj dopóki kod powrotu jest niezerowy)
do
    lista_poleceń             (będzie wykonane co najmniej raz!)
done

until polecenie1 ; do lista_poleceń ; done

UWAGA Najpierw wykonywane jest polecenie1, ale NIE JEST sprawdzany
kod powrotu. Potem wykonywana jest lista poleceń, następnie znowu
wykonywane jest polecenie1 i teraz JEST sprawdzany kod powrotu.

Przykładowe śledzenie włamywacza:

until [ "$(who | grep adam)" ]          (adam nie powinien pracować)
    sleep 60
done

Programowanie w Shellu (index)