Proszę nie pisać skryptów, które działają po wylogowaniu się z systemu.
Skrypty — cd
Poza pętlą for w skryptach można wykorzystywać pętlę while i warunek if. Dla obu komend przydatne jest polecenie test.
Polecenie test służy do sprawdzania wartości wyrażeń logicznych. Uwaga: polecenie test zwraca 0, jeśli wyrażenie jest prawdziwe, zaś wartość różną od 0, jeśli wyrażenie jest fałszywe. Komenda test może służyć także do sprawdzania praw dostępu do plików, jednak w poniższych przykładach możliwość ta nie jest wykorzystywana.
W przykładach poniżej przedstawiono proste skrypty, które sprawdzają wartość logiczną różnych wyrażeń.
Sprawdzenie, czy ciąg znaków ma długość różną od 0:
Wersja pierwsza
> cat 10skrypt.skr #!/bin/sh if test -z "$1" then echo pierwsza zmienna ma długość 0 else echo $1 fi > |
Powyższy skrypt przedstawia strukturę polecenia if: słowo „then” jest traktowane jak polecenie i musi znajdować się w drugiej linii lub być oddzielone średnikiem. Cała pętla musi być zakończona słowem „fi”. Można stosować polecenia „else” lub „elif” (przykłady poniżej). Test z opcją –z testuje, czy ciąg znaków ma długość 0.
Wersja druga
> cat 11skrypt.skr #!/bin/sh if test "$1" = ""; then echo pierwsza zmienna ma długość 0 else echo $1 fi > |
Sprawdzenie, czy ciąg znaków ma długość różną od 0 (i wartości ciągu znaków)
#!/bin/sh if test -n "$1" then if test "$1" = user then if test -n "$2" then echo $2 else echo prosze wpisac dwie zmienne fi elif test "$1" = usr then if test -n "$2" then echo $2 else echo prosze wpisac dwie zmienne fi else echo pierwsza zmienna jest nieprawidłowa fi else echo prosze podac dwie zmienne fi > |
Test z opcją –n testuje, czy ciąg znaków jest niezerowy.
W następnym przykładzie pokazano skrypt, który sprawdza, czy ciągi znaków są takie same.
> cat 13skrypt.skr #!/bin/sh if test "$1" = echo then echo cos tam else echo inne cos tam fi > |
W kolejnym przykładzie: czy ciągi znaków są różne.
> cat 14skrypt.skr #!/bin/sh if test "$1" != echo then echo pierwsza zmienna jest inna niz echo else echo pierwsza zmienna to echo fi > |
W zasadzie testowanie liczb może się odbywać na tej samej zasadzie, co testowanie ciągów znaków. Jednak w takim przypadku ciągi „123” i „0123” są różne. Dlatego można wykorzystywać flagi komendy test przedstawione w przykładzie poniżej:
> cat 15skrypt.skr #!/bin/sh if test "$1" -ne 01 then echo pierwsza zmienna jest rozna od 1 fi if test "$1" -eq 01 then echo pierwsza zmienna wynosi 1 elif test "$1" -lt 1 then echo pierwsza zmienna jest mniejsza od 1 elif test "$1" -gt 1 then echo pierwsza zmienna jest wieksza od 1 fi > |
Pętla while działa dotąd, dopóki warunek jest spełniony. W przykładzie poniżej pętla while przegląda tablicę procesów dotąd, dopóki nie zaloguje się użytkownik podany jako pierwsza zmienna skryptu.
Wykorzystywane jest polecenie cut, wycinające pole ze strumienia wejściowego:
cut –fNr_pola –d "rozgraniczenie" — wycina pole o podanym numerze oddzielone od poprzedniego i następnego symbolem podanym w cudzysłowie. Jeśli nie zostanie podany żaden symbol, stosowany jest znak tabulacji. Można wypróbować komendę: > ps -ef | grep sshd | grep -v pts | cut -f6 -d " ".
> cat 16skrypt.skr #!/bin/sh if test -z "$1" then echo prosze podac username exit fi NAME=$1 echo $NAME while test "$NAME" != `w | grep $NAME | cut -f1 -d" "` do for F in `ps -ef` do echo $F sleep 3 done done echo zalogowal się > |
1. Proszę zrobić zadanie 3 z poprzedniego laboratorium.
2. Proszę napisać skrypt, który przegląda pliki w katalogu i wszystkim plikom, które nie mają w nazwie „.”, zaś są wykonywalne, dodaje rozszerzenie „.exe”.
3. Proszę napisać skrypt, który potrafi zmieniać katalogi.
Uwaga: w 2 i w 3 ćwiczeniu wystarczy wykorzystać komendy: cut, grep i ls. Proszę uważać w 2 ćwiczeniu – wszystkie katalogi są na ogół wykonywalne.
4. Proszę napisać skrypt, który potrafi sam siebie zabić (kill).
W 4 ćwiczeniu proszę pamiętać o $0.