Po zapoznaniu się z wyrażeniami %% ## oraz poleceniami dirname i basename, wróćmy do definiowania zmiennych przez użytkownika oraz do różnorodnych możliwości manipulowania zmiennymi przez użytkownika.
Jak wiemy bash shell umożliwia użytkownikowi definiowanie zmiennych, których zadaniem jest przechowywanie wartości podczas przetwarzania informacji przez skrypt. Nazwy zmiennych mogą być dowolnej, rozsądnej długości muszą rozpoczynać się literą lub znakiem podkreślenia "_" i mogą występować w nazwach dowolne ze znaków "_ a-z A-Z 0-9". Zmiennej można przypisać w programie wartość raz lub wiele razy. Można również do niej się odwołać w celu odczytania przechowywanej wartości dowolnie wiele razy. Zmienne shella stanowią integralną część programów bashowych. Służą głównie do przechowywania i przetwarzania informacji wewnątrz skryptu. Użytkownik całkowicie nadzoruje wykorzystywane zmienne. Podczas rozwiązywania zadania może tworzyć lub usuwać dowolnie wiele zmiennych. Jak wiemy po utworzeniu zmiennej za pomocą prostego przypisania wartości do nazwy zmiennej (uwaga: nie wstawia się spacji pomiędzy znak = i nazwę zmiennej oraz jej wartość)
$ pogoda=zimno
→Wartość każdej zmiennej można wyświetlić używając następujących dwóch składni:
$ echo $nazwa_zmiennej
$ echo ${nazwa zmiennej}
$ alfabet=ABCDEFGHIJKLMNOPQRSTUVWXYZ
Wyrażenie ${zmienna:początek:długość} jest zastąpiona podciągiem znaków, który zaczyna się od pozycji początek i którego liczba znaków równa się długości. Jeżeli w naszym przypadku chcielibyśmy wyselekcjonować litery FG to polecenie wyglądałoby w następujący sposób:
$ echo ${alfabet:5:2}
Jeżeli parametr długość jest nieobecny to wtedy selekcjonujemy podciąg znaków od wskazanego początku do końca ciągu znaków. I tak jeżeli w linii poleceń wystukamy:
$ echo ${alfabet:20}
UVWXYZ
Zdefiniujmy teraz zmienną: litery
$ litery=AZERTYUIOPAZERTYUIOP
$ echo ${litery#AZE}
RTYUIOPAZERTYUIOP
→Wyjaśnienie: wiemy, że operator # doprowadza do usunięcia – począwszy od lewej strony - z ciągu znaków zawartym w zmiennej litery najkrótszy ciąg znaków odpowiadający wzorcowi. Wzorcem są litery AZE a więc są one po prostu skasowane.
$ echo ${litery#*T}
YUIOPAZERTYUIOP
→ Wyjaśnienie: pozostawiamy czytelnikowi
$ echo ${litery#*[MNOP]}
PAZERTYUIOP
→ Wyjaśnienie: Wzorcem jest wyrażenie *[MNOP] AZE a więc wszystkie litery są kasowane aż do pierwszej napotkanej w interwale MNOP. Jest nią litera „O”, która także jest skasowana.
$ echo ${litery##AZE}
RTYUIOPAZERTYUIOP
→ Wyjaśnienie: wiemy, że operator ## doprowadza do usunięcia – począwszy od lewej strony - z ciągu znaków zawartym w zmiennej litery najdłuższego ciągu znaków odpowiadający wzorcowi. Wzorcem są litery AZE a więc są one po prostu skasowane.
Zauważmy, że w tym wypadku nie ma różnicy pomiędzy działaniem operatora # i operatora ##.
$ echo ${litery##*T}
YUIOP
→ Wyjaśnienie: wiemy, że operator ## doprowadza do usunięcia – począwszy od lewej strony - z ciągu znaków zawartym w zmiennej litery najdłuższego ciągu znaków odpowiadający wzorcowi. Wzorcem jest wyrażenie *T, ponieważ – przypomnimy zmienna litery zawiera:
AZERTYUIOPAZERTYUIOP
AZER↑YUIOPAZER↑
...Pierwsze Drugie
....Wystąpienie T Wystąpienie T
Wynika z tego, że kasujemy najdłuższy ciąg znaków odpowiadających wzorcowi, czyli kasujemy wszystkie litery do „drugiego wystąpienia T” , wraz z literą T.
Wyjaśnienie pozostałych wyników pozostawiamy czytelnikowi:
$ echo ${litery%IOP*}
AZERTYUIOPAZERTYU
$ echo ${litery%%IOP*}
AZERTYU
$ echo ${litery%[X-Z]*}
AZERTYUIOPAZERT
$ echo ${litery%%[X-Z]*}
A
Programowanie Rozdział 9.6 Darmowy kurs Linux