Wprowadzenie do rozszerzeń parametrów powłoki bash
- 2742
- 193
- Pan Jeremiasz Więcek
Shell jest kluczową częścią systemu operacyjnego opartego na Unixie i jest głównym interfejsem, którego możemy użyć do interakcji z samym systemem. Bash jest bez wątpienia najczęściej używaną powłoką w większości rozkładów Linux: urodził się jako zamiennik oprogramowania dla Bourne Shell
(Bash to akronim dla Bourne-Again Shell) Wewnątrz projektu GNU. W tym samouczku dowiemy się, jak działają niektóre z najbardziej przydatnych rozszerzeń Bash.
Jeśli nie znasz jeszcze Bash lub po prostu musisz odświeżyć pamięć, należy odwiedzić nasz samouczek Skrypt Bash dla początkujących, zanim zagłębisz się w koncepcję rozszerzeń powłoki Bash poniżej.
W tym samouczku nauczysz się:
- Jak korzystać z różnych rozszerzeń parametrów bash
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od rozkładu |
Oprogramowanie | Powłoka bash |
Inny | Podstawowa znajomość Bash |
Konwencje | # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny |
Najprostsze możliwe rozszerzenie
Najprostszą możliwą składnią rozszerzenia parametru jest następujące:
$ parametr
Kiedy używamy tej składni, parametr
jest zastąpiony jego wartością. Zobaczmy przykład:
$ site = "Linuxconfig.org "$ echo" $ strona "LinuxConfig.org
Stworzyliśmy strona
zmienna i przypisała „Linuxconfig.org "
ciąg do niego. Następnie użyliśmy Echo
polecenie wyświetlania wyniku rozszerzenia zmiennej. Będąc tym podstawowym rozszerzeniem, zadziałałoby nawet bez użycia nawiasy klamrowe
wokół nazwy zmiennej:
$ echo „$ strona” LinuxConfig.org
Dlaczego użyliśmy nawiasy klamrowe
Następnie? Krężnicy, podczas wykonywania rozszerzeń parametrów, służą do wyznaczania nazwy zmiennej:
$ echo "Czytasz ten artykuł na $ site_!„Czytasz ten artykuł na temat
Co się stało? Ponieważ nazwa zmiennej nie była ograniczona, _
Postać uznano za część tego. Shell próbował rozszerzyć istnienie ówczesnego $ site_
Zmienna, dlatego nic nie zostało zwrócone. Owijanie zmiennej za pomocą kręconych aparatów ortodontycznych rozwiązuje ten problem:
$ echo "Czytasz ten artykuł na temat $ strona _!„Czytasz ten artykuł na temat Linuxconfig_!
Chociaż użycie klamrowych nie zawsze jest potrzebne z podstawowym rozszerzeniem parametrów, obowiązkowe jest wykonywanie wszystkich innych rozszerzeń, które zobaczymy w tym artykule.
Przed kontynuowaniem, pozwól, że dam ci jedną wskazówkę. W powyższym przykładzie skorupa próbowała rozszerzyć nieistniejącą zmienną, dając pusty wynik. Może to być bardzo niebezpieczne, szczególnie podczas pracy z nazwami ścieżek, dlatego podczas pisania skryptów zawsze zaleca się użycie rzeczownik
Opcja, która powoduje wyjście powłoki z błędem za każdym razem, gdy odwołuje się nie do istniejącej zmiennej:
$ set -o vounset $ echo "Czytasz ten artykuł na $ site_!„Bash: Site_: niezwiązana zmienna
Praca z pośrednim
Użycie $ !parametr
Składnia, dodaje poziom pośrednica do naszego rozszerzenia parametrów. Co to znaczy? Parametr, którego powłoka będzie próbowała rozwinąć, nie jest parametr
; Zamiast tego spróbuje użyć wartości parametr
jako nazwa zmiennej, która ma zostać rozszerzona. Wyjaśnijmy to przykładem. Wszyscy znamy DOM
Zmienna rozszerza się na ścieżce katalogu domowego użytkownika w systemie, prawda?
$ echo "$ home" /home /egdoc
Bardzo dobrze, jeśli teraz przypisujemy ciąg „dom”, do innej zmiennej i używamy tego typu rozszerzenia, otrzymujemy:
$ VARILE_TO_INDECT = "home" $ echo "$ !VARILE_TO_INDECT " /home /egdoc
Jak widać w powyższym przykładzie, zamiast uzyskać „dom”, tak jak by się stało, gdybyśmy wykonali proste rozszerzenie, powłoka użyła wartości VARILE_TO_INDECT
Jako nazwa zmiennej do rozszerzenia, dlatego mówimy o poziomie pośredniego.
Rozszerzenie modyfikacji przypadków
Ta składnia rozszerzenia parametru Zmieńmy przypadek znaków alfabetycznych wewnątrz ciągu wynikającego z rozszerzenia parametru. Powiedzmy, że mamy zmienną o nazwie nazwa
; Aby wykorzystać tekst zwrócony przez rozszerzenie zmiennej, używalibyśmy $ parametr^
składnia:
$ name = "egidio" $ echo "$ name^" egidio
Co jeśli chcemy podnieść cały ciąg, zamiast go wykorzystać? Łatwy! Używamy $ parametr ^^
składnia:
$ echo "$ nazwa ^^" egidio
Podobnie, do małej litery pierwszej postaci sznurka, używamy $ parametr,
Składnia ekspansji:
$ name = "egidio" $ echo "$ name," egidio
Do małej litery cały ciąg, zamiast tego używamy $ parametr ,,
składnia:
$ name = "egidio" $ echo "$ nazwa ,," egidio
We wszystkich przypadkach wzór
Aby dopasować pojedynczy znak. Po podaniu wzorca operacja jest stosowana tylko do części oryginalnego ciągu, który go pasuje:
$ name = "egidio" $ echo "$ nazwa ,, [dio]" egidio
W powyższym przykładzie dołączamy postacie w nawiasach kwadratowych: powoduje to, że każdy z nich jest dopasowany jako wzór.
Korzystając z rozszerzeń, które wyjaśniliśmy w tym akapicie i parametr
to tablica dolna przez @
Lub *
, Operacja jest stosowana do wszystkich zawartych w niej elementów:
$ my_array = (jeden dwa trzy) $ echo "$ my_array [@] ^^" jeden dwa trzy trzy trzy
Po odwoływaniu się indeksu określonego elementu w tablicy, zamiast tego stosuje się operację:
$ my_array = (jeden dwa trzy) $ echo "$ my_array [2] ^^" trzy
Usunięcie podłańca
Następna zbadamy składnię, pozwala nam usunąć wzór
Od początku lub od końca łańcucha wynikającego z rozszerzenia parametru.
Usuń pasujący wzór od początku łańcucha
Następna składnia, którą zbadamy, $ parametr#wzór
, pozwala nam usunąć wzór
z początek z
ciąg wynikający z parametr
ekspansja:
$ name = "egidio" $ echo "$ Nazwa#egi" Dio
Podobny wynik można uzyskać za pomocą „$ parametr ## wzorzec”
składnia, ale z jedną ważną różnicą: w przeciwieństwie do tej, którą użyliśmy w powyższym przykładzie, który usuwa najkrótszy wzór dopasowywania Od początku łańcucha usuwa najdłużej jeden. Różnica jest wyraźnie widoczna podczas korzystania z *
postać w wzór
:
$ name = "egidio losle" $ echo "$ Nazwa#*i"
W powyższym przykładzie użyliśmy *
w ramach wzoru, który należy usunąć z łańcucha wynikającego z rozszerzenia nazwa
zmienny. Ten dzika karta
Pasuje do dowolnej postaci, więc sam wzorzec przekłada się na postać „ja” i wszystko przed nią ”. Jak już powiedzieliśmy, kiedy używamy $ parametr#wzór
Składnia, najkrótszy wzór dopasowania jest usuwany, w tym przypadku jest to „EGI”. Zobaczmy, co się stanie, gdy używamy „$ parametr ## wzorzec”
Zamiast tego:
$ name = "egidio laille" $ echo "$ Nazwa ##*i" le
Tym razem najdłuższy dopasowanie jest usuwany („Egidio Doci”): najdłuższy możliwy mecz obejmuje trzeci „ja” i wszystko przed nim. Rezultatem ekspansji jest po prostu „le”.
Usuń pasujący wzór z końca łańcucha
Składnia, którą widzieliśmy powyżej, usuń najkrótszy lub najdłuższy pasujący wzór od początku sznurka. Jeśli chcemy, aby wzór został usunięty z koniec ciągu, zamiast tego musimy użyć $ parametr%wzór
Lub $ parametr %% wzór
rozszerzenia, aby usunąć odpowiednio najkrótszy i najdłuższy dopasowanie od końca ciągu:
$ name = "egidio losle" $ echo "$ Nazwa%i*" egidio doc
W tym przykładzie wzorzec, który dostarczyliśmy z grubsza, tłumaczy się w postaci „ja” i wszystko po nim, zaczynając od końca sznurka ”. Najkrótszym meczem jest „Ile”, więc zwracane jest „Egidio Doc”. Jeśli spróbujemy tego samego przykładu, ale używamy składni, która usuwa najdłuższy dopasowanie, jaki otrzymujemy:
$ name = "egidio losle" $ echo "$ name %% i*" np
W takim przypadku po najdłuższym dopasowaniu, co jest zwracane, to „np.”.
We wszystkich rozszerzeniach, które widzieliśmy powyżej, jeśli parametr
jest tablicą i jest indeksowy *
Lub @
, Usunięcie pasującego wzoru jest stosowane do wszystkich jego elementów:
$ my_array = (jeden dwa trzy) $ echo "$ my_array [@]#*o" ne Three
Wyszukaj i wymień wzór
Użyliśmy poprzedniej składni, aby usunąć pasujący wzór od początku lub z końca łańcucha wynikającego z rozszerzenia parametru. Co jeśli chcemy zastępować wzór
z czymś innym? Możemy użyć $ parametr/wzór/string
Lub $ parametr // wzorca/string
składnia. Ten pierwszy zastępuje tylko pierwsze występowanie wzoru, a drugie wszystkie zdarzenia:
$ frase = "żółty jest słońcem, a żółty to cytryna" $ echo "$ fraza/żółta/czerwona"
parametr
(fraza) jest rozszerzone i najdłuższy mecz wzór
(żółty) jest do niego dopasowany. Mecz jest następnie zastępowany przez dostarczone strunowy
(czerwony). Jak można obserwować tylko pierwsze zdarzenie, więc cytryna pozostaje żółta! Jeśli chcemy zmienić wszystkie wystąpienia wzoru, musimy go prefiksować /
postać:
$ frase = "żółty jest słońcem, a żółty to cytryna" $ echo "$ fraza // żółty/czerwony"
Tym razem wszystkie wystąpienia „żółtego” zostały zastąpione przez „czerwony”. Jak widać, wzór jest dopasowany wszędzie tam, gdzie znajduje się w ciągu wynikającego z rozszerzenia parametr
. Jeśli chcemy określić, że musi być dopasowane tylko na początku lub na końcu ciągu, musimy go odpowiednio przedrostkować #
Lub %
postać.
Tak jak w poprzednich przypadkach, jeśli parametr
jest tablicą dolnym przez jedno z nich *
Lub @
, Zastąpienie odbywa się w każdym z jego elementów:
$ my_array = (jeden dwa trzy) $ echo "$ my_array [@]/o/u" une twu trzy
Rozszerzenie pod substring
$ parametr: offset
I $ parametr: offset: długość
Rozszerzenia pozwól nam rozwinąć tylko część parametru, zwracając podłoże zaczynające się od określonego zrównoważyć
I długość
postacie długie. Jeśli długość nie jest określona, rozszerzenie przebiega do końca oryginalnego ciągu. Ten rodzaj rozszerzenia jest nazywany rozszerzenie pod substring
:
$ name = "egidio losilne" $ echo "$ Nazwa: 3"
W powyższym przykładzie dostarczyliśmy tylko zrównoważyć
, bez określania długość
, Dlatego wynikiem ekspansji był podłoże uzyskane przez rozpoczęcie od znaku określonego przez przesunięcie (3).
Jeśli określamy długość, podłoże rozpocznie się od zrównoważyć
i będzie długość
Postacie długie:
$ echo "$ Nazwa: 3: 3" Dio
Jeśli zrównoważyć
jest ujemny, jest obliczany od końca łańcucha. W takim przypadku należy dodać dodatkowe miejsce :
w przeciwnym razie powłoka uzna to za inny rodzaj rozszerzenia zidentyfikowanego przez :-
który służy do zapewnienia wartości domyślnej, jeśli parametr do rozszerzenia nie istnieje (rozmawialiśmy o tym w artykule o zarządzaniu rozszerzeniem pustych lub niezaprzeczalnych zmiennych bash):
$ echo "$ name: -6"
Jeśli dostarczony długość
jest ujemny, zamiast interpretować jako całkowitą liczbę znaków, że powstały ciąg powinien być długi, jest uważany za przesunięcie do obliczania od końca łańcucha. Wynikiem ekspansji będzie zatem podłoże od początku zrównoważyć
i kończąc na długość
Znaki z końca oryginalnego ciągu:
$ echo "$ nazwa: 7: -3"
Podczas korzystania z tego rozszerzenia i parametr
jest indeksowaną tablicą subskrybowaną przez *
Lub @
, zrównoważyć
jest w odniesieniu do indeksów elementów tablicy. Na przykład:
$ my_array = (jeden dwa trzy) $ echo "$ my_array [@]: 0: 2" jeden dwa $ echo "$ my_array [@]: -2" dwa trzy trzy trzy trzy trzy
Negatyw długość
, Zamiast tego generuje błąd rozszerzenia:
$ echo "$ my_Array [@]: 0: -2" bash: -2: Wyrażenie substringowe < 0
Rozszerzenie „długości”
Podczas korzystania z $ #parametr
Rozszerzenie, wynik rozszerzenia nie jest wartość parametru, jego długość:
$ name = "egidio" $ echo "$ #name" 6
Gdy parametr
jest tablicą, która jest indeksowa *
Lub @
, Zwracana jest liczba zawartych w nim elementów:
$ my_array = (jeden dwa trzy) echo "$ #my_array [@]" 3
Gdy odwołuje się określony element tablicy, jego długość jest zwracana zamiast tego:
$ echo "$ #my_array [2]" 5
Składając wszystko
W tym artykule widzieliśmy składnię wielu rozszerzeń. Widzieliśmy, jak małe lub zwiększyć pierwszą literę łańcucha wynikającą z rozszerzenia zmiennej, jak korzystać z poziomu pośredniego, jak wykonywać usuwanie pod substring i rozszerzenie podrzędne, jak zastąpić wzór dostarczonym ciągiem i jak to Wykonaj parametr rozszerzony w długości jego wartości, zamiast samej wartości.
To nie jest wyczerpująca lista wszystkich możliwych rozszerzeń, które możemy wykonać z Bash: zapoznaj się z dokumentacją GNU, jeśli chcesz dowiedzieć się więcej. W artykule wspomnianym również Bash tablice
: Aby dowiedzieć się więcej o nich, możesz przeczytać nasz artykuł dedykowanych tablic bash.
Powiązane samouczki Linux:
- Rzeczy do zainstalowania na Ubuntu 20.04
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Hung Linux System? Jak uciec do wiersza poleceń i…
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
- Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
- Ubuntu 20.04 Przewodnik
- Rzeczy do zainstalowania na Ubuntu 22.04
- Zainstaluj Arch Linux na stacji roboczej VMware
- Pobierz Linux