Wprowadzenie do rozszerzeń parametrów powłoki bash

Wprowadzenie do rozszerzeń parametrów powłoki bash

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

Wymagania oprogramowania i konwencje linii poleceń Linux
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