Skrypty powłoki Bash #7 - o sznurkach
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.

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

${var/wzór/slowo}: zamień napotkany wzór w łańcuchu na słowo.
${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.
${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.
${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
- Q : (quote) zamyka słowo między

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.
${var:?error}: jeżeli var==null lub “unset”, wyrzuć error na stderr.${var:+value}: jeżeli ustawiona, podstaw value ale nie przestawiaj var.
${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.
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 :)