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

AZERYUIOPAZER

...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