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.