Środowisko programisty/Bash - pisanie skryptów: Różnice pomiędzy wersjami
→Argumenty: Pierwsza wersja |
→Argumenty: Pierwsza wersja |
||
Linia 94: | Linia 94: | ||
|} | |} | ||
Aby operować na dalszych argumentach pomocne jest polecenie '''shift''', które usuwa pierwszy argument, a pozostałe przesuwa o jeden w lewo. Aby ''n''-krotnie wywołać polecenie shift wystarczy podać mu to ''n'' jako argument '''shift''' ''n''. | Aby operować na dalszych argumentach pomocne jest polecenie '''shift''', które usuwa pierwszy argument, a pozostałe przesuwa o jeden w lewo. Aby ''n''-krotnie wywołać polecenie shift wystarczy podać mu to ''n'' jako argument '''shift''' ''n''. | ||
Na przykład dla skryptu '''test_arg.sh''' o zawartości | |||
#!/bin/sh | |||
# Testowanie argumentów | |||
echo "Uruchomiłeś program `basename $0`" | |||
echo Wszystkie: $@ | |||
echo "Pierwsze trzy: '$1', '$2', '$3'" | |||
shift 2 | |||
echo "shift 2" | |||
echo "Wszystkie: $@" | |||
echo "Pierwsze trzy: '$1', '$2', '$3'" | |||
mamy efekt | |||
bashtest@host:~$ ./test_arg.sh Raz Dwa "To jest zdanie" Cztery | |||
Uruchomiłeś program test_arg.sh | |||
Wszystkie: Raz Dwa To jest zdanie Cztery | |||
Pierwsze trzy: 'Raz', 'Dwa', 'To jest zdanie' | |||
shift 2 | |||
Wszystkie: To jest zdanie Cztery | |||
Pierwsze trzy: 'To jest zdanie', 'Cztery', '' | |||
bashtest@host:~$ | |||
== Wyrażenia == | == Wyrażenia == |
Wersja z 16:55, 7 sie 2006
Atrybuty plików
W systepie typu Unix jest podział na użytkowników i grupy. Każdy użytkownik może przynależeć do kilku grup. Do wyświetlania przynależności do grup służy polecenie groups.
bashtest@host:~$ groups users bashtest@host:~$ groups bashtest root kubus bashtest : users root : root kubus : users cdrom floppy audio src video staff bashtest@host:~$
Bez argumentów wyświetla przynależność do grup aktualnego użytkownika. Z argumentami przynależność do grup podanych użytkowników. Na przykład użytkownik kubus przynależy do większej ilości grup, co daje mu większe prawa w systemie.
Każdy plik/katalog należy do dokładnie jednego użytkownika i grupy. Z każdym plikiem/katalogiem związane są trzy rodzaje praw dostępu:
r | prawo do odczytu, |
w | prawo do modyfikacji (czyli do zapisu, bądź usunięcia), |
x | prawo do uruchomienia; w przypadku katalogu oznacza to prawo do zmiany bieżącego katalogu na ten katalog. |
Prawa dostępu przydzielane są trzem kategoriom użytkowników:
- użytkownicy, do których należy dany plik,
- inni użytkownicy z grupy, do której należy dany plik,
- wszyscy pozostali użytkownicy.
Aby wyświetlić informacje o właścicielach i prawach dostępu możemy użyć polecenia ls z opcją -l:
bashtest@host:~$ ls -l razem 128 drwx------ 2 bashtest users 4096 2006-07-08 09:37 Mail d-wx--x--x 2 bashtest users 4096 2006-08-07 15:28 niedostępny_katalog ----rw---- 1 bashtest users 5 2006-08-07 15:30 plik_dla_pozostałych_userów -rwxr-xr-x 1 root root 109552 2006-08-07 15:32 program -rw-r--r-- 1 bashtest users 13 2006-08-01 15:18 test.txt bashtest@host:~$
Po lewej stronie są prawa dostępu. Literka po lewej mówi o typie pliku, kolejne trzy literki pokazują prawa dostępu dla pierwszej kategorii użytkowników, kolejne trzy o drugiej kategorii użytkowników i ostatnie trzy literki o ostatniej kategorii. W trzeciej i czwartej kolumnie pokazany jest użytkownik i grupa do której należy dany plik/katalog.
Mail i niedostępny_katalog są katalogami (literka d po lewej). Katalog Mail jest dostępny tylko dla użytkownika bashtest (2-4 literki rwx oznaczają ustawione wszystkie prawa dostępu: do odczytu, zapisu i uruchamiania). Katalog niedostępny_katalog nie ma ustawionych praw do odczytu, zatem nie można wyświetlić jego zawartości, ale można zmienić na niego bieżący katalog, gdyż ma ustawione prawa do uruchomienia. Plik plik_dla_pozostałych_userów mogą odczytywać i modyfikować tylko użytkownicy inni niż bashtest należący do grupy users. Plik program jest programem i można go uruchamiać.
Do zmiany właściciela służą polecenia chown i chgrp. Do zmiany praw dostępu służy polecenie chmod.
Pierwszy skrypt
Przygotujmy plik hello_world.sh o następującej zawartości:
#!/bin/sh echo "Hello world"
Rozszerzenie sh jest standardowym rozszerzenie skryptów napisanych w bashu. Nie jest ono konieczne, ale dobrze, gdy już sama nazwa pliku mówi nam o jego typie. Pierwsza linijka jest podpowiedzią dla systemu jak ma być uruchomiony ten plik. System użyje polecenia /bin/sh do interpretacji tego pliku.
Spróbujmy uruchomić ten plik.
bashtest@host:~$ hellow_world.sh bash: hellow_world.sh: command not found bashtest@host:~$
Takie polecenie nie zostało znalezione. System szuka danego polecenia wśród wszystkich katalogów zapamiętanych na zmiennej środowiskowej PATH. Zobaczmy co zawiera ta zmienna.
bashtest@host:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games bashtest@host:~$
Na jak widzimy nie zawiera bieżącego katalogu, w którym znajduje się nasz skrypt. Przy uruchamianiu polecenia, które nie znajduje katalogu podanym w PATH, trzeba podawać również ścieżkę (względną, bądź bezwzględna) przed nazwą pliku. W tym przypadku musimy podać katalog bieżący, co najprościej można zrobić przy użyciu kropki.
bashtest@host:~$ ./hello_world.sh bash: ./hello_world.sh: Brak dostępu bashtest@host:~$
Tym razem dostaliśmy komunikat o złych prawach dostępu. Zobaczmy.
bashtest@host:~$ ls -l hello_world.sh -rw-r--r-- 1 bashtest users 29 2006-08-07 15:45 hello_world.sh bashtest@host:~$
No tak ten plik nie ma ustawionych praw do uruchamiania. Możemy to zrobić używając polecenia chmod. Aby ustawić prawa uruchamiania tylko dla użytkownika bashtest możemy użyć opcji u+x, a jeśli chcemy ustawić prawa uruchamiania dla wszystkich, to używamy opcji a+x. W tym przypadku ustawimy prawa uruchamiania tylko dla nas.
bashtest@host:~$ chmod u+x hello_world.sh bashtest@host:~$ ls -l hello_world.sh -rwxr--r-- 1 bashtest users 29 2006-08-07 15:45 hello_world.sh bashtest@host:~$
Teraz wygląda lepiej spróbujmy uruchomić nasz skrypt.
bashtest@host:~$ ./hello_world.sh Hello world bashtest@host:~$
Udało się!
Komentarze
Komentarze zaczynają się od symbolu #. Wszystkie pozostałe znaki aż do końca linii są ignorowane. W pierwszej linii skryptu helo_world.sh mamy już taki komentarz, który jest zarazem informacją dla systemu. Dodajmy jeszcze dwa komentarze.
#!/bin/sh # Przykładowy skrypt wypisujący napis "Hello world" echo "Hello world" # Tutaj wypisujemy co trzeba
Argumenty
Skrypty podobnie jak dowolne programy możemy uruchamiać podając im argumenty. Następujące zmienne o specjalnych nazwach pozwalają odczytywać argumenty:
$# | zwraca liczbę argumentów, |
$0 | zwraca nazwę pliku bieżącego programu, |
$1, $2, ... | zwraca odpowiednio pierwszy argument, drugi argument, itd., |
$@ | rozwija się do listy wszystkich argumentów; przydatne jeśli chcemy przekazać wszystkie argumenty innemu programowi, przy czym jeśli chcemy mieć pewność, że każdy argument będzie osobnym słowem, to należy użyć cudzysłowów: "$@"; ma to znaczenie na przykład wtedy, gdy istnieje argument, który zawiera spację. |
Aby operować na dalszych argumentach pomocne jest polecenie shift, które usuwa pierwszy argument, a pozostałe przesuwa o jeden w lewo. Aby n-krotnie wywołać polecenie shift wystarczy podać mu to n jako argument shift n.
Na przykład dla skryptu test_arg.sh o zawartości
#!/bin/sh # Testowanie argumentów echo "Uruchomiłeś program `basename $0`" echo Wszystkie: $@ echo "Pierwsze trzy: '$1', '$2', '$3'" shift 2 echo "shift 2" echo "Wszystkie: $@" echo "Pierwsze trzy: '$1', '$2', '$3'"
mamy efekt
bashtest@host:~$ ./test_arg.sh Raz Dwa "To jest zdanie" Cztery Uruchomiłeś program test_arg.sh Wszystkie: Raz Dwa To jest zdanie Cztery Pierwsze trzy: 'Raz', 'Dwa', 'To jest zdanie' shift 2 Wszystkie: To jest zdanie Cztery Pierwsze trzy: 'To jest zdanie', 'Cztery', bashtest@host:~$