Programowanie w Shellu (index)
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
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
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
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.
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)
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
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