skrypty

Transkrypt

skrypty
Przekazywanie parametrów do skryptu
Utwórzmy plik o nazwie katalog1, który będzie zawierał tylko jedno polecenie :
# mcedit katalog1
Następnie nadajmy wszystkim użytkownikom prawo do jego wykonywania:
# chmod a+x katalog1
W tym momencie skrypt katalog1 możemy wyegzekwować, wiemy jednak, że lista plików i
podkatalogów wyświetlona na ekranie dotyczyłaby tylko katalogu bieżącego. Co możemy
zrobić by otrzymać listę plików z innych katalogów bez każdorazowego poprawiania skryptu
katalog1 ?
Aby zautomatyzować (przynajmniej częściowo) wyświetlanie plików w różnych katalogach,
zastosujemy mechanizm przekazywania parametrów do skryptu. Jak pamiętamy polecenie w
Linuksie składa się z samego polecenia np. ls , opcji np. –l i argumentów np. /usr.
Zarówno opcje jak argumenty możemy nazwać parametrami. Nazwa skryptu jest też
poleceniem, któremu możemy przekazać parametry, z tym że parametry przekazywane do
skryptu przypisywane są zmiennym, które oznaczamy jako $1, S2……S9. $1 odpowiada
pierwszemu argumentowi polecenia, $2 drugiemu itd. Co to w praktyce oznacza ?
Przypuśćmy, że chcemy wyświetlić na ekranie – egzekwując skrypt katalog1 – zawartość
katalogu /tmp, w tym celu wykonamy następujące polecenie:
$
katalog1 /tmp
Jest to wartość, którą przyjmuje zmienna $1 (pierwszy argument polecenia katalog1), z czego
wynika, że nasz skrypt musimy zmienić w następujący sposób:
$1 przybiera zawsze wartość pierwszego argumentu polecenia w tym wypadku /tmp, jeżeli
chcielibyśmy obejrzeć zawartość katalogu /usr to musimy wykonać polecenie:
# ./katalog /usr
$1 przybierze w tym wypadku wartość /usr
Dodajmy, że istnieje także zmienna $0 zawiera ona nazwę skryptu (polecenia). Wiemy, że
możemy skryptowi przekazać 9 parametrów od $1 do $9. Przećwiczmy problem parametrów
praktycznie. W tym celu utworzymy plik o nazwie skrypt2.
$ mcedit skrypt2
Następnie – po nadaniu odpowiednich praw skryptowi (jeżeli użytkownik tych praw nie
posiada) wyegzekwujmy skrypt1 w następujący sposób:
....$1 $2 $3
$ ./skrypt1 89 34 21
Na ekranie powinny pojawić się napisy:
Zmienne oznaczone znakiem $ mogą w linii poleceń egzekucji skryptu przybierać także
wartości następujące:
$* → reprezentuje wszystkie zmienne, niezależnie od ich liczby
$# → pokazuje liczbę podanych zmiennych
$@ → argumenty linii poleceń są „cytowane” pojedynczo
Bardzo ważna jest różnica między wyrażeniami $* (wszystkie zmienne) i $# (liczba
zmiennych). Pierwsza wartość ($*) odnosi się do wszystkiego, co jest w wierszu poleceń, od
$1 do nieskończoności (choć tak naprawdę w każdej powłoce jest jakiś limit zmiennych).
Druga wartość ($#) nie odnosi się do samych zmiennych, ale zwraca ich liczbę. Aby pokazać
tę różnicę, rozważmy poniższe skrypty. Utwórzmy skrypt pod nazwą skrypt3 który zawierał
będzie tylko:
$ mcedit skrypt3
$ ./skrypt3 x y z q
x y z q
zmieńmy teraz skrytp 3 i porównajmy wyniki obu wersji:
$ ./skrypt3 x y z q
4
Jak więc widzimy zmienna S* odnosi się do wszystkich argumentów z linii poleceń natomiast
zmienna $# liczy te argumenty. Jaka jest w takim razie różnica pomiędzy zmienną $* a
zmienną $@ ? Obie robią to samo jednak zmienna $@ pozwala na osobne użycie każdego z
nich. Różnica pomiędzy tymi zmiennymi nie jest zbyt widoczna, dopóki nie użyjemy ich do
argumentów używających strukturę kontrolną pętli for-in. W zarządzaniu zmiennymi $
definiowanymi przez system możemy użyć polecenia shift. Polecenie to bierze wszystkie
zmienne począwszy od $1 i zmniejsza ich liczbę o jeden. Zmienna $0 nigdy się nie zmienia,
ale kiedy używamy polecenia shift po raz pierwszy to $2 staje się $1, $3 staje się $2 itd.
Proces ten powtarza się przy każdorazowym użyciu polecenia shift. Utwórzmy skrypt4:
$ mcedit skrypt4
Dokonamy teraz egzekucji skrypt4 z następującymi argumentami:
$ skrypt4 raz dwa trzy cztery
Polecenie shift nie wie, ani czy zmienne istnieją, ani ile ich jest. W przypadku dużej liczby
zmiennych nie stanowi to problemu, ale w przypadku małej liczby zmiennych można
nieświadomie przesuwać nieistniejące zmienne, co może powodować wyświetlanie pustych
wierszy, a czasami nawet komunikatów o błędach. Jeśli w powyższym przykładzie podamy w
wierszu poleceń tylko jedna zmienną, wygenerowany zostanie następujący komunikat o
błędzie:
shift : shift skrtpt4 must be <= $#