Proces interpretera poleceń (podobnie, jak inne procesy) przechowuje w swojej pamięci
pewną liczbę zmiennych wraz z przyporządkowanymi im wartościami. Zarówno nazwy
zmiennych, jak i przyporządkowane im wartości są łańcuchami (napisami). W pamięci
procesu (dokładniej: w końcowym fragmencie segmentu danych zmiennych) są one
przechowywane w postaci listy par:
zmienna_1 = wartość_1
zmienna_2 = wartość_2
.....................
zmienna_n = wartość_n
(por. tablice asocjacyjne w języku PHP innych językach skryptowych).
Użytkownik interpretera poleceń ma możliwość wyświetlania listy zmiennych oraz jej
modyfikacji (dopisywania nowych zmiennych, usuwania zmiennych oraz zmiany ich
wartości).
UWAGA: zmienne inicjowane w procesie bash'a w chwili jego uruchomienia mają wpływ na
sposób jego funkcjonowania - nieostrożna zmiana ich wartości może utrudnić lub
uniemożliwić dalsze korzystanie z bash'a w danym oknie tekstowym. Niektóre spośród
zmiennych są zabezpieczone przed usunięciem i zmianą wartości (mogą tylko być
odczytywane).
ZADANIA
Zad. 1
Zapoznać się z działaniem polecenia wewnętrznego set (bez argumentów), obejrzeć
zbiór zmiennych i ich wartości wyświetlanych przez to polecenie. Zwrócić uwagę na
zmienne HOME, PATH, PWD, PS1, SECONDS i spróbować odgadnąć ich znaczenie
(zaobserwować, czy/kiedy zachodzi zmiana ich wartości).
Zad. 2Przeczytać opis i zapoznać się z działaniem polecenia zewnętrznego env, porównać
zbiór wyświetlanych zmiennych ze zbiorem wyświetlanym przez polecenie set.
Zad. 3W podkatalogu public_html utworzyć plik o dowolnej nazwie z rozszerzeniem .php,
prawach dostępu 705 (oktalnie) i następującej zawartości:
<HTML>
<BODY>
<?PHP system("env"); ?>
</BODY>
</HTML>
obejrzeć plik w przeglądarce internetowej, porównać wyświetlony wykaz zmiennych
środowiska serwera HTTP z wyświetlonym w zad.2 wykazem zmiennych środowiska
bash'a.
UWAGA: po wykonaniu zadania należy usunąć utworzony plik, gdyż zwiększa on
zagrożenie systemu serwera.
Zad. 4Utworzyć kilka nowych zmiennych i przypisać im wartości pisząc zmienna=napis .
wyświetlić wartości przy użyciu polecenia echo $zmienna. przypisać nowe wartości
pisząc zmienna=nowy_napis , sprawdzić, że poprzednie wartości zostały nadpisane
przez nowe. przypisać zmiennej pusty łańcuch: zmienna= , usunąć zmienną: unset
zmienna .
Niektóre spośród wszystkich zmiennych danego procesu są oznakowane jako zmienne
środowiska (są to te, które są wyświetlane przez polecenie env). Zmienne środowiska są
dziedziczone przez wszystkie procesy potomne danego procesu (w momencie uruchomienia
procesu potomnego są kopiowane do jego środowiska). Użytkownik bash'a ma możliwość
zaznaczania zmiennych jako należących do środowiska (czyli przeznaczonych do
dziedziczenia), jak również usuwania tego oznakowania.
Zad. 5
Sprawdzić, że polecenie set wyświetla utworzone zmienne, zaś polecenie env - nie
wyświetla. Użyć polecenia export zmienna do umieszczenia jej w środowisku
(wyeksportowania), sprawdzić, że polecenie env będzie ją teraz wyświetlało.
Wypróbować działanie polecenia export -n zmienna (usunięcie ze środowiska).
Uruchomić nową kopię bash'a (polecenie bash), sprawdzić, że odziedziczone zostały
tylko te zmienne, które aktualnie były w środowisku pierwotnego bash'a. Wyłączyć
kopię bash'a (polecenie exit).
Bash posiada dość bogatą kolekcją operacji na łańcuchach stanowiących wartości zmiennych
- obliczanie długości, złączanie (konkatenacja), wycinanie podłańcuchów, sprawdzanie
zgodności z podanym wzorcem i inne.
Zad. 6Wypróbować możliwości wykonywania operacji na napisach stanowiących wartości
zmiennych:
zmienna=$zmienna1$zmienna2 #konkatenacja dwóch wartości zmiennych echo $zmienna
zmienna=napis$zmienna1 #konkatenacja stażej i wartości zmiennej echo $zmienna
echo ${#zmienna} #długość napisu
echo ${zmienna:pozycja} #wyświetlenie podłańcucha końcowego od #danej pozycji (pozycje są numerowane od 0)
echo ${zmienna:pozycja:długość} #wyświetlenie podłańcucha o danej długości #począwszy od danej pozycji
Przeczytać w opisie bash'a wykaz możliwości wykonywania bardziej złożonych
operacji na łańcuchach.
Jeśli wartości zmiennych są poprawnymi zapisami liczb całkowitych (w sensie reguł
składniowych bash'a), jest możliwe wykonywanie na nich operacji arytmetycznych (z
typowego zbioru udostępnianego przez języki programowania, w zakresie arytmetyki liczb
całkowitych).
Zad. 7 Zadeklarować kilka zmiennych numerycznych (liczbowych) pisząc:
declare -i zmienna1 zmienna2 ... zmienna_n
Przyporządkować im wartości całkowitoliczbowe
pisząc zmienna=liczba . Wypróbować możliwość wykonywania obliczeń
arytmetycznych przy użyciu zadeklarowanych zmiennych:
a) zmienna=wyrażenie_arytmetyczne; echo $zmienna
b) echo $((wyrażenie_arytmetyczne))
Przeczytać w opisie bash'a wykaz dostępnych operatorów i reguły konstruowania
wyrażeń arytmetycznych.
Zad. 8Wypróbować wykonywanie działań arytmetycznych na: a) liczbach ósemkowych
(zaczynających się od 0); b) liczbach szesnastkowych (zaczynających się od 0x lub
0X); liczbach przy dowolnej innej podstawie (zaczynających się od podstawa# , na
przykład 2#100 oznacza liczbę binarną 100, czyli dziesiętną 4).
UWAGA: argumenty działań arytmetycznych mogą być liczbami o różnych podstawach, ale
wynik zawsze będzie wyświetlony w postaci dziesiętnej.
Operator o postaci $(polecenie) (starsza forma: `polecenie` - uwaga: użyte są znaki
odwrotnych apostrofów !) powoduje uruchomienie danego polecenia, a po jego zakończeniu
zastąpienie powyższego napisu tym, co dane polecenie wyprowadziło na swoje wyjącie
standardowe (z usuniętymi znakami nowej linii). Może to posłużyć do przypisania zmiennej
wartości wyprowadzonej przez dane polecenie na wyjącie standardowe.
Zad. 9 Wypróbować działanie poleceń:
a) zmienna=$(cat nazwa_pliku); echo $zmienna
b) zmienna=$(ls); echo $zmienna
c) zmienna=$(ls | wc -l); echo $zmienna
Zad. 10Obejrzeć zawartości plików systemowych /etc/profile i /etc/bashrc oraz
własnych plików startowych .bash_profile i .bashrc . Przeczytać w opisie
bash'a (rozdział INVOCATION), kiedy i w jakiej kolejności są one
wykonywane. Uzupełnić zawartość pliku .bashrc o wyświetlenie własnego
komunikatu powitalnego i ustawienie zmiennej środowiska PATH jak w
poprzednim zadaniu. Zapisać plik, otworzyć nowe okno tekstowe i sprawdzić,
że wprowadzone zmiany przynoszą skutek.
UWAGA: nie zepsuć skryptu, nie zmieniać praw dostępu !