Tablice: indeksy całkowite >=0 tworzenie: TABLICA[0]=45 TABLICA[1]=23 TABLICA[2]=78 lub TABLICA=(45 23 78) lub TABLICA=($@) odwołanie echo ${TABLICA[3] echo ${TABLICA[*] echo ${TABLICA[@] Długość zmiennej: - wszystkie elementy - wszystkie elementy ${#ZMIENNA długość zmiennej ${#TABLICA[@] - długość tablicy ${#TABLICA[$idx] długość elementu tablicy pod indeksem $idx Instrukcja warunkowa: if war1; then instr1 elif war2; then instr2 instre np. Pętla while: if [ $ZM1 -eq $ZM2 ]; then... while war; instr np. while [ -n "$1" ]; echo $1 shift
Pętla for: for param; echo $param #wyswietl kolejny parametr... for plik in `nd. -name "*.txt"` echo $plik for le in * ; echo $le TAB=(3 7 1 0) for t in ${TAB[@] echo $t for licz in 1 4 6 echo $licz for i in `seq 1 10`; echo $i for ((licz=0;licz<=15;licz++)) echo $licz for ((a=1;a<=$#;a++)); echo $a : ${!a Exit-code: $? 0 wykonanie poprawne, pozostałe błędne - status wykonania potoku to status ostatniego polecenia polecenie1 && polecenie2 - polecenie2 jest wykonywane wttw gdy polecenie1 zwróciło 0, statusem takiej listy jest status ostatnio wykonanego polecenia polecenie1 polecenie2 - polecenie2 jest wykonywane wttw polecenie1 zwróciło status niezerowy, statusem takiej listy jest status ostatnio wykonanego polecenia
Warunki: exit-code np. if grep Ala plik.txt then echo Znalazlem "Ala" w plik.txt echo Nie znaleziono "Ala" w plik.txt test / [... ] np. if test 3 -lt $ZM ; then echo Liczba wieksza od 3 elif [ 3 -eq $ZM ] ; then echo Liczba rowna 3 echo Liczba mniejsza od 3 Testy związane z: plikami/katalogami np. -f plik, -d katalog, napisami np. =,!=, liczbami np. -eq, -ne, AND, OR, NOT : -a, -o,!... Obliczanie wyrażeń cd.: expr: ZMIENNA=`expr 2 + 3` ZMIENNA=$[10*2] ZMIENNA=$[ZMIENNA+5] ZMIENNA=$((11%3)) ZMIENNA=$((ZMIENNA*3)) ((ZMIENNA=ZMIENNA+2)) operacje zmiennoprzecinkowe ZMIENNA=`echo 2.3+3 bc` Wykorzystanie wyniku polecenia cd.: `...` $() ZM=`grep Ala plik.txt wc -l` ZM=$(grep Ala plik.txt wc -l)
Podprogramy.: nazwa_podpogramu () { instr1; instr2; instr3;... argumenty : $1, $2,..., $9 (stępne również $0, $@, $#, shift ) przykład: znajdz () { KAT=$1 ROZSZ=$2 nd $KAT -name *.$ROZSZ znajdz $HOME sh przykład rekurencji : #wywolanie podprogramu silnia () { if [ $1 -eq 0 ] ; then echo 1 echo $[$1 * `silnia $[$1 1]`] wywołanie: silnia 5 Zadania: 0. napisz skrypt, który wczyta od użytkownika liczbę n i wyświetli swój n-ty argument 1. napisz skrypt, który sprawdza, czy został wywołany z argumentami i wypisuje stosowną informację 2. napisz skrypt, który wypisuje swoje argumenty, każdy w osobnym wierszu 3. napisać skrypt, który spróbuje wyświetlić plik podany jako jedyny argument. Po udanej operacji powinien wyświetlić komunikat o prawidłowym działaniu, jeśli wystąpił jakiś błąd (np. brak pliku o takiej nazwie), powinien wyświetlić komunikat o braku sukcesu 4. napisać skrypt, który sprawdza czy podany jest kładnie jeden argument (w przeciwnym przypadku zgłasza błąd): - jeśli jedyny argument jest katalogiem - wypisuje jego zawartość
- jesli jest plikiem - wypisuje jego treść - w przeciwnym przypadku zgłasza błąd 5. napisać skrypt, który wszystkie argumenty skryptu zapisze w tablicy, następnie zaś wykorzystując tę tablicę, znajdzie najdłuższy z nich 6. napisać skrypt, który wyszuka w bieżącym katalogu pliki zawierające swoją nazwę 7. napisać skrypt, który wszystkie pliki w bieżącym katalogu z rozszerzeniem podanym jako pierwszy argument skopiuje katalogu BACKUP w tym katalogu (jeśli istnieje nie-katalog o takie nazwie, należy zgłosic błąd). Jeżeli taki katalog nie istnieje, skrypt powinien go założyć. Brak argumentu (rozszerzenia plików) oznacza, że kopiowane są wszystkie pliki. Następnie spakować i skompresować ten katalog poleceniem tar pliku backupdata.tgz, (gdzie DATA oznacza dzisiejszą datę w formacie YYYY-MM-DD uzyskaną z polecenia date), zaś katalog BACKUP usunąć 8. napisać skrypt, którego jedynym argumentem jest katalog (należy sprawdzić, czy taki katalog istnieje). Dla każdego pliku w tym katalogu oraz we wszystkich jego podkatalogach zostanie wypisana nazwa pliku i rozmiar w bajtach (for+nd+wc) Jeśli katalog nie zostanie podany, to powinien zostać przeskanowany katalog bieżący.