Intro

Dzień dobry, dzień dobry.

Dzisiaj przejdziemy do świata konfekcji damskiej …..

Znaczy do wyboru odpowiedniego sznurka do prasy ….

Ale ja tu chyba miałem o skryptach pisać…. Już wiem ! Porozmawiamy o łańcuchach znaków, z angielskiego strings :)

Panie, a co to za marka?

Łańcuchy znaków (ang. Strings) są to zbiory znaków ułożone zgodnie z pewnym wzorcem.

Tak można powiedzieć bardziej specyficznie. Najlepiej czym są łańcuchy znaków, będą wiedzieć osoby, które pisały w języku C (czystym C, żadne c++ czy c#) albo w assemblerze (Ci to powinni chyba mieć odruchy na drukowanie znaków w asemblerze :) )

W języku C by, stworzyć string, tworzyło się tablicę typu znakowego o określonej długości i jedna komórka przechowywała jeden znak, a cała tablica była stringiem.

Dobra, ale odbiegliśmy, wracamy do bash’a

Panie a jak to uruchomić?

Tworzenie łańcuchów znakowych jest bardzo proste, wystarczy napisać:

var=text

I tyle, bez żadnych cudzysłowów i działa.

Sprawa jest bardziej skomplikowana, gdy chcemy taką zmienną odczytać.

Teoretycznie echo $var załatwia sprawę, tak?

Tak, ale nie do końca. Już tłumaczę i objaśniam.

Panie, a co to za szajs?

Szajs to z pana, że nie umiesz się Pan posługiwać.

Wracając do tego drukowania

Kiedy nasze słowo jest zapisane w zmiennej, to możemy wywołać je, bez żadnych konsekwencji przy pomocy $zmienna tylko w przypadku, gdy mamy 200% pewności, że nasz łańcuch nie zawiera słów lub znaków kluczowych. W przeciwnym wypadku możemy zrobić ładny bajzel na systemie.

Dlatego też warto, jest zapisać zmienną w cudzysłowie lub apostrofach zależnie, czy chcemy interpretowania znaków specjalnych ($, `,\) przez " " czy jako czysty literał ‘ ‘. Dobrym zwyczajem i zaleceniem jest dodatkowo zamykanie zmiennej (nie tylko znakowej) w nazywanej przeze mnie klatce, czyli {}.

Czyli użycie bezpiecznej, zalecanej zmiennej będzie wyglądało tak:

echo "${var}"

Ktoś mógłby się przyczepić, do tego, że pisałem o '' a nie ma przykładu. A to dlatego, że '' używamy podczas przypisywania zmiennej, gdybyśmy musieli tam jakieś znaki specjalne wstawić. Natomiast konstrukt "${var}" rozwiązuję tylko pierwszy poziom znaków specjalnych, czyli nawet gdybyśmy niżej mieli jakąś komendę, to ona zostanie potraktowana jako literał i nie zostanie wywołana przez powłokę.

Panie fajne to, a co z tym zrobić można?.

Łańcuchy znakowe, możemy wykorzystać, do przechowywania danych, przeprowadzania testów logicznych i wielu innych działań.

Czasami są potrzebne jakieś operacje na nich, by dostosować format danych do jakiegoś przypadku.

Mamy kilka możliwości manipulowania łańcuchami:

  • ${var#wzór} : usuń z początku wyrazu najkrótszy znaleziony wzór.
  • ${var##wzór} : usuń z początku wyrazu najdłuższy znaleziony wzór.

wzor1

  • ${var%wzór} : usuń z końca wyrazu najkrótszy znaleziony wzór.
  • ${var%%wzór} : usuń z końca wyrazu najdłuższy znaleziony wzór.

wzor2

  • ${var/wzór/slowo} : zamień napotkany wzór w łańcuchu na słowo. wzor3
  • ${var^} V${var^wzor} : zamień pierwszą literę, lub pierwsze wystąpienie wzoru z małej a dużą.
  • ${var^^}V ${var^^wzor} : zamień całe słowo, lub każde wystąpienie wzoru z małych liter na duże. wzor4
  • ${var,}V${var,wzor} : zamień pierwszą literę lub pierwsze wystąpienie wzoru z dużej na małą.
  • ${var,,}V${var,,wzor} : zamień całe słowo lub każde wystąpienie wzoru z dużych liter na małe. wzor5
  • ${var@operator} : transformacja łańcucha zależnie od parametru.
    • Q : (quote) zamyka słowo między ' '.
    • E : (evaluate) wykonuje wszystkie znaki ucieczki w tekście.
    • P : (prompt) potraktuj ten łańcuch jakby, był wprowadzany w konsoli. Czyli wykonaj komendy, które się w tym łańcuchu znajdują.
    • A : (assigment) przedstaw łańcuch w formie przypisywania
    • a : (attributes) pokaż atrybuty tego łańcucha

wzor6

Panie co to jeszcze potrafi?

Jest jeszcze kilka dodatkowych ciekawych operacji, które możemy wykonać przy współpracy z łańcuchami znaków. Operacje, które tu przedstawię, zaliczają się do działań podstawiania. Więcej o podstawianiu innym razem :)

Operacje podstawiania:

  • ${var} : wartość zmiennej var.
  • ${var:-value} : jeżeli var==null lub “unset”, podstaw value ale nie ustawiaj var.
  • ${var:=value} : jeżeli var==null lub “unset”, podstaw value i ustaw var. wzor7
  • ${var:?error} : jeżeli var==null lub “unset”, wyrzuć error na stderr.
  • ${var:+value} : jeżeli ustawiona, podstaw value ale nie przestawiaj var. wzor8
  • ${var:przesunięcie} : zwróć wartość, ale wyświetl, zaczynając od pozycji podanej jako przesunięcie.
  • ${var:przesunięcie:długość} :zwróć tyle liter, jaka jest długość, ale wyświetl, zaczynając od pozycji podanej jako przesunięcie.
  • ${!prefix*} V ${!prefix@} : zwróć mi nazwy wszystkich zmiennych zaczynających się od podanego prefiksu.
  • ${#var} : zwróć mi długość var. wzor9

Panie to ja biere i ide!

To by było na dziś wszystko. Mam nadzieję, że przybliżyłem wam co nieco temat łańcuchów znakowych (ang. string) (polinglisz Stringów) i przyda się to w waszych przyszłych projektach.

Ja się z wami na dziś żegnam.

Życzę miłego dnia i smacznej kawusi :)