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 :)