Wykład 13
System operacyjny
Linux
Skrypty powłoki
Powłoka (shell) -
przypomnienie
Powłoka
(ang.
shell
) to pośrednik
między
systemem
operacyjnym
a
użytkownikiem.
Jej
zadaniem
jest
interpretacja komend wydawanych przez
użytkow-nika.
Zazwyczaj
komendy
powłoki
dają
możliwość
tworzenia
prostych programów - skryptów. Skrypty
służą
głównie
zadaniom
administracyjnym (operacje na plikach,
katalogach), powłoka nie udostępnia
bowiem zbyt bogatej arytmetyki.
Powłoka (shell) -
przypomnienie
System Linux nie jest związany z
konkretną
powłoką
-
najczęściej
używane to
bash
oraz
csh
. Różnice
między nimi dotyczą przede wszystkim
składni
komend
oraz
sposobu
posługiwania się zmiennymi.
My wykorzystamy powłokę csh, a zatem
na początku każdego skryptu umieścimy
jej wywołanie:
#!/bin/csh
Zmienne
Skrypt może korzystać ze zmiennych,
które trakto-wane są jak ciągi znaków -
nie mają typu np. liczbo-wego. Po
nadaniu wartości dostęp do danej
zmiennej
jest
możliwy
przez
poprzedzenie jej nazwy znakiem
$
#!/bin/csh
setenv x 20
echo $x
Zmienne środowiskowe
Powłoka
tworzy
specjalne
zmienne
„środowiskowe” opisujące stan systemu
- bieżący katalog, nazwę użyt-kownika
itp.
Listę
tych
zmiennych
podaje
komenda
env
; oczywiście nie trzeba
nadawać im wartości początkowej.
#!/bin/csh
echo $PWD ; echo $HOME
cd $HOME
Zmienne środowiskowe
Niektóre przydatne zmienne:
HOME
- katalog domowy
USER
- login użytkownika
HOST
- nazwa naszego komputera
PWD
- bieżący katalog
PATH
- katalogi, w których system szuka
komend
SHELL
- nazwa bieżącej powłoki
Zmienne środowiskowe
„Skrypt powitalny”:
#!/bin/csh
echo „Witaj $USER !”
echo „Komputer $HOST życzy miłej pracy”
echo „Korzystasz z powłoki $SHELL”
Interpretacja łańcucha
znaków
Czym różni się zapis
echo Witaj $USER
od
echo „Witaj $USER”
lub
echo ‘Witaj
$USER’
? W pierwszym i drugim
przypadku zamiast $USER zobaczymy
swój login, w trzecim - apostrofy „zabez-
pieczą”
nas
przed
podstawieniem
wartości zmiennej. Pierwszy i drugi
przypadek też się różnią - w pierw-szym
mamy dwa elementy znakowe, w drugim
zaś - jeden dwuwyrazowy łańcuch.
Argumenty
Skrypt,
jak
prawdziwa
komenda
systemowa, może posługiwać się danymi
przekazanymi
przez
użytkow-nika.
Argumenty z linii poleceń dostępne są
pod nazwami
$1
,
$2
,
$3
... zaś
$*
podaje
całą zawartość linii poleceń. Zmienna
$<
powoduje wczytanie linii tekstu z
klawiatury. Zmienna
$0
podaje nazwę
pliku zawierającego skrypt.
Argumenty
#!/bin/csh
echo „Skrypt $0 wita”
echo „Pierwszy argument to $1”
echo „Wpisz teraz coś”
setenv linijka $<
echo „A teraz ja powtarzam: $linijka”
Taki skrypt powinniśmy wywołać z
argumentem, np.
./skrypt argument1
Instrukcja sterująca „if”
#!/bin/csh
echo „Podaj nazwę pliku”
setenv plik $<
if
( -e $plik )
then
echo „Ten plik istnieje”
else
echo „Tu nie ma takiego pliku!”
endif
Wyrażenia logiczne
( -e $plik )
!( -e $plik )
„NEGACJA”
(( -e $plik1 ) && (-e $plik2))
„I”
(( -e $plik1 ) || (-e $plik2))
„LUB”
( $tekst1 == $tekst2 )
„RÓWNOŚĆ”
( $tekst1 != $tekst2 )
„NIERÓWNOŚĆ”
-e
:plik istnieje
-r
:mam prawo odczytu
-d
:plik to katalog
-w
-x
-z
:plik jest pusty
-l
:plik to skrót
Wyrażenia logiczne
#!/bin/csh
echo „Podaj nazwę pliku”
setenv plik $<
if
(( -w $plik ) && (-z $plik))
then
echo „Ten plik mogę skasować, jest pusty”
rm $plik
else
echo „Nie skasuję tego pliku”
endif
Pętla „foreach”
#!/bin/csh
foreach
x
(
1 2 3 4 5
)
echo Tworzę pusty plik o nazwie a${x}b
touch a${x}b
end
Jeśli nazwa zmiennej może „wtopić się”
w otaczający tekst, wydzielamy ją
nawiasami klamrowymi!
a${x}b
a$xb
Pętla „foreach”
#!/bin/csh
unalias ls
foreach
x
(`ls `)
if (-d $x ) then
echo Plik $x to katalog
endif
end
Użyto tutaj odwróconych apostrofów:
`ls` - taka kon-strukcja wpisuje w dane
miejsce wynik działania komendy (tutaj
ls) jako zmienną tekstową - linijkę
tekstu.
„switch” - instrukcja
wyboru
#!/bin/csh
switch (
$1
)
case
"a*"
:
echo Argument zaczyna się od a
breaksw
case
"b*"
:
echo Argument zaczyna się od b
breaksw
default:
echo Dziwny argument
endsw
Pętla „while” („dopóki”)
#!/bin/csh
echo Wpisz coś
echo Aby zakonczyć wpisz KONIEC
setenv napis O
while (
$< != „KONIEC”
)
echo Jesteś w pętli WHILE
echo $napis
setenv napis ${napis}O
end