Rozszerzenia powłoki Bash rozszerzenie, rozszerzenie parametrów i więcej

Rozszerzenia powłoki Bash rozszerzenie, rozszerzenie parametrów i więcej
W tym artykule omówimy wszystkie podstawowe funkcje rozszerzenia powłoki bash. Niektóre z najbardziej złożonych i interesujących rozszerzeń to rozszerzenie klamra i rozszerzenie parametrów, które mają wiele funkcji i opcji, które są potężne, ale opanowane tylko z czasem przez programistów Bash i Linux DevOps. Podzielanie słów jest również dość interesujące i czasami pomijane. Nazwa pliku, ekspansja arytmetyczna i zmienna podstawienie są dobrze znane. Omówimy wiele tematów i pokażemy przykłady polecenia i najbardziej przydatnych składni dla każdej składni. Więc zacznijmy.
  • Środowisko
  • Zastąpienie dowodzenia
  • Zastąpienie procesu
  • Zmienne podstawienie
  • Rozszerzenie klamry
  • Rozszerzenie parametru
  • Parametry pozycyjne
  • Rozszerzenie Tylde
  • Podstawienie arytmetyczne
  • Dzielenie słów
  • Rozszerzenie nazwy pliku
  • Wniosek

Środowisko

Aby przetestować wszystkie funkcje rozszerzeń powłoki Bash, musimy upewnić się, że uruchamiamy najnowszą wersję Bash. Poniżej znajdują się informacje systemowe dla tego artykułu. Testy w tym artykule odbywają się na Ubuntu 19.10 Jak pokazano poniżej.

$ uname -a
Instancja Linux-1 5.3.0-1014-GCP #15-ubuntu SMP Wt. 3 04:14:57
UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Wersja Bash dla tych testów to Bash Version 5, która jest dość nowa. Starsze wersje Bash brakuje wielu funkcji.

$ bash --version
GNU Bash, wersja 5.0.3 (1) -renease (x86_64-pc-linux-gnu)
Copyright (c) 2019 Free Software Foundation, Inc.
Licencja GPLV3+: GNU GPL wersja 3 lub nowsza

Zastąpienie dowodzenia

Podstawienie polecenia umożliwia uruchomienie jednego lub wielu poleceń oraz przechwytywania wyników i działań z tych poleceń, a włączenie ich do innego polecenia w jednym wierszu lub mniejszym wierszom niż uruchamianie wszystkich poleceń osobno. Zastąpienie dowodzenia ma dwie składni; Bardziej popularna składnia to składnia backtick, w której wykonanie polecenia jest zamknięte w dwóch tylnych lub backticks. Druga składnia, która jest równie potężna, obejmuje polecenia w składni $ (), a wyjście może być używane z tego nowego rozszerzenia. Spójrzmy na kilka przykładów zastąpienia dowództwa poniżej.

Proste podstawienie polecenia za pomocą składni $ () do uruchomienia polecenia daty.

$ echo $ (data)
Wed 18 marca 01:42:46 UTC 2020

Proste podstawienie polecenia za pomocą składni backtick do uruchomienia polecenia daty.

$ echo „data”
Wed 18 marca 01:43:17 UTC 2020

Korzystanie z operatora stdin na początku składni zastępczej polecenia jest fantazyjnym sposobem odczytania tekstu pliku do zmiennej i użycia go w poleceniu na powłoce jak poniżej.

$ echo „hello świat”> myText
$ echo $ (< mytext)
Witaj świecie

Przeczytaj plik do zmiennej, która ma być używana w poleceniu za pomocą komendy CAT i podstawienia polecenia.

$ echo „hello świat”> myText
$ echo $ (cat myText)
Witaj świecie

Tak samo jak powyżej, przeczytaj plik i użyj go w podstawieniu polecenia za pomocą backticks i CAT Command.

$ echo „hello świat”> myText
$ echo „cat myText”
Witaj świecie

Połącz wbudowaną podstawienie dowodzenia z innym podstawieniem dowództwa za pomocą zarówno $ (), jak i wspólnie opracowuje się

$ echo 'echo $ (data) | cut -d "" -f 1'> myfile
$ cat myfile
Poślubić

Wbudowane podstawy dowodzenia w innym użyciu dwóch operacji składniowych $ ()

$ echo "Dzisiaj jest $ (echo $ (data) | cut -d" "-f 1)"> myfile
$ cat myfile
Dzisiaj jest ślub

Użyj wyjścia z polecenia jako argumentów do innego polecenia, z składnią backtick. Otrzymamy listę plików, uruchamiając Cat, który zawiera jeden plik na wiersz, a następnie przekazamy to do polecenia RM, które usunie każdy plik

$ Touch One; Dotknij dwa
$ echo one> myfile; echo dwa >> myfile
$ rm „cat myfiles”

Tak samo jak powyżej, ale ze składnią $ (), przejdź wyjście polecenia z CAT do polecenia RM, aby usunąć pliki.

$ Touch One; Dotknij dwa
$ echo one> myfile; echo dwa >> myfile
$ rm $ (cat myfiles)

Przechowuj dane wyjściowe z polecenia CAT w zmienną, a następnie zapętlij zmienną, aby lepiej zobaczyć, co się dzieje.

$ Touch One; Dotknij dwa
$ echo one> myfile; echo dwa >> myfile
$ Myfiles = $ (cat myfiles)
$ za f in $ myfiles; echo $ f; rm $ f; zrobione
jeden
dwa

Tak samo jak powyżej, ale użyj składni BackTicks, aby uruchomić polecenie CAT i przechowywać wyjście w zmiennej, a następnie zapętla się za pośrednictwem plików Int zmienna.

$ Touch One; Dotknij dwa
$ echo one> myfile; echo dwa >> myfile
$ Myfiles = 'cat myfiles'
$ za f in $ myfiles; echo $ f; rm $ f; zrobione
jeden
dwa

Użyj podstawienia polecenia z operatorem stdin, aby odczytać wiersz pliku w linii do zmiennej, a następnie zapętla się za pośrednictwem zmiennych Posewords

$ Touch One; Dotknij dwa
$ echo one> myfile; echo dwa >> myfile
$ Myfiles = $ (< myfiles)
$ za f in $ myfiles; echo $ f; rm $ f; zrobione
jeden
dwa

Zastąpienie procesu

Podstawienie procesu jest udokumentowaną cechą BASH; Moim zdaniem jest to dość tajemnicze. W rzeczywistości nie znalazłem wielu dobrych przypadków użycia, które mogłyby do niego polecić. Jeden przykład jest tutaj uwzględniony dla kompletności, w której używamy podstawienia procesu, aby uzyskać wyjście polecenia, a następnie użyć go innej komendy. Wydrukujemy listę plików w odwrotnej kolejności za pomocą polecenia sort w tym przykładzie po pobraniu plików z polecenia LS.

$ Touch One.tekst; Dotknij dwa.tekst; dotknij trzech.tekst
$ sort -r <(ls *txt)
dwa.tekst
trzy.tekst
jeden.tekst

Zmienne podstawienie

Zmienne podstawienie jest tym, co można rozważyć podstawowe użycie zmiennych i zastąpienie wartości zmiennej, gdy jest ona odwołana. Jest dość intuicyjne, kilka przykładów podano poniżej.

Proste przypisanie i użycie zmiennej, w których umieszczamy ciąg w zmiennej x, a następnie drukuje się na stdout

$ X = 12345
$ echo x x
12345

Sprawdź, czy zmienna jest przypisana coś lub zerowa, w tym przypadku jest przypisana, więc drukujemy ją na stdout

$ X = 12345
$ if [-z "$ x"]; wtedy echo „x is null”; else echo $ x; fi
12345

Sprawdź, czy zmienna jest przypisana coś lub null, w tym przypadku nie jest ustawiona, więc drukujemy „jest null” zamiast wartości.

$ unset x
$ if [-z "$ x"]; wtedy echo „x is null”; else echo $ x; fi
X jest NULL

Rozszerzenie klamry

Rozszerzenie Brace to super potężna funkcja bash, która pozwala pisać bardziej kompaktowe skrypty i polecenia. Ma wiele różnych funkcji i opcji opisanych poniżej. W ramach szelków Twoja składnia jest interpretowana z bardziej szczegółową składnią w zależności. Spójrzmy na szereg przykładów rozszerzenia klamry.

Każda wersja elementów na liście w klamrach jest wykonywana. Więc przechodzimy od jednego polecenia echa i drukujemy 3 wersje słowa poniżej oddzielone przestrzeniami.

$ echo a, m, p _warehouse
A_warehouse M_warehouse P_warehouse

Wyrażenia w ekspansji powodują wykonanie wiele razy. Aby to udowodnić, używamy polecenia daty i snu, aby potwierdzić, że polecenie daty jest uruchamiane raz dla każdej iteracji wzoru w rozszerzeniu klamry.

$ echo a, m, p _ $ (data; sleep 1)
a_sun marca 22 18:56:45 UTC 2020 M_SUN 22 marca 18:56:46 UTC
2020 P_SUN 22 18:56:47 UTC 2020

Rozszerzenia wykorzystujące liczby z… spowodują rozszerzenie liczb sekwencyjnych w sekwencji numerycznej

$ echo 1… 8 _warehouse
1_warehouse 2_warehouse 3_warehouse 4_warehouse 5_warehouse 6_warehouse 7_warehouse
8_warehouse

Rozszerzenie ortżeru do odwrotnego rzędu z sekwencją liczb

$ echo 8… 1 _warehouse
8_warehouse 7_warehouse 6_warehouse 5_warehouse 4_warehouse 3_warehouse 2_warehouse
1_warehouse

Korzystanie z opcjonalnej wartości przyrostu do określenia liczbowych przyrostów rozszerzenia klamry

$ echo 1… 9… 3 _warehouse
1_warehouse 4_warehouse 7_warehouse

Rozszerzenie klamry leksykograficznej itera przez litery w alfabecie w kolejności regionu

$ echo a… e _warehouse
A_warehouse B_warehouse C_warehouse D_warehouse e_warehouse

Rozszerzenie kleksycznego ortewowego zamówienia odwrotnego

$ echo e… a _warehouse
E_warehouse D_warehouse C_warehouse B_warehouse A_warehouse

Rozszerzenie klamry leksykograficznej z określonym przyrostem będzie iterowane za pomocą listy znaków od początku do punktu końcowego, ale pomiń znaki zgodnie z wartością przyrostową

$ echo a… z… 5 _warehouse
A_warehouse F_warehouse K_warehouse P_warehouse U_warehouse Z_Warehouse

Rozszerzenie multiplikatywnego klamry z 2 rozszerzeniami klamr

$ echo a… e 1… 5 _warehouse
A1_warehouse A2_warehouse A3_warehouse A4_warehouse A5_warehouse B1_warehouse
B2_warehouse B3_warehouse B4_warehouse B5_warehouse C1_warehouse C2_warehouse
C3_warehouse C4_warehouse C5_warehouse D1_warehouse D2_warehouse D3_warehouse
D4_warehouse D5_warehouse E1_warehouse E2_warehouse E3_warehouse E4_warehouse
E5_warehouse

Rozszerzenie klamry, aby dwa razy używać tego samego korzenia w poleceniu. To tworzy foo.Plik TGZ TAR z katalogu pod nazwą FOO. Jest to poręczna składnia, w której używasz go w innej pętli i chcesz założyć, że podstawa słowa jest używana wiele razy. Ten przykład pokazuje to z smoły, ale można go również używać z MV i CP zgodnie z tym przykładem.

$ mkdir foo
$ touch foo/foo a… e
$ tar czvf foo .TGZ,
bla/
FOO/FOOB
FOO/FOOC
FOO/FOOA
Foo/Food
FOO/FOOE

Rozszerzenie parametru

Rozszerzenie parametrów jest również ładną kompaktową składnią z wieloma możliwościami, takimi jak: Zezwalaj na skrypty ustawione wartości domyślne dla zmiennych lub opcji Unset, operacje pod substring, wyszukiwanie i zastępowanie podstawników i innych przypadków użycia. Przykłady są poniżej.
Sprawdź null i użyj parametru, jeśli nie null lub wartość domyślna. W takim przypadku x nie jest zerowe, więc zostanie użyty

$ X = 1
$ echo $ x: -2
1

Sprawdź null i użyj parametru, jeśli nie null lub wartość domyślna. W takim przypadku x jest zerowe, więc zostanie użyta wartość domyślna

$ unset x
$ echo $ x: -2
2

Sprawdź, czy zmienna jest zerowa, ustaw i echem, czy jest zerowa. X jest przypisany 2 i wydrukowane $ x. Może to zarówno ustawić zmienną, jak i użyć jej w poleceniu za pomocą składni $ : =.

$ unset x
$ if [-z "$ x"]; Następnie echo null; fi
ZERO
$ echo $ x: = 2
2
$ if [-z "$ x"]; Następnie echo null; else echo $ x; fi
2

Rozszerzenie pod substring zastąpi z punktu przesunięcia pewną liczbą znaków w ciągu

$ X = "Hello World"
$ echo $ x: 0: 7
Witam w

Zmień przesunięcie na drugą postać i wydrukuj 7 znaków podłoża

$ X = "Hello World"
$ echo $ x: 1: 7
Ello wo

Podłoże od początku sznurka, ale odetnij ostatnie 2 znaki

$ X = "Hello World"
$ echo $ x: 0: -2
Witam Wor

Uzyskaj długość ciągu dzięki tej wersji rozszerzenia parametrów

$ X = "Hello World"
$ echo $ #x
11

Wyszukaj i wymień w zmiennej. W tym przykładzie zastąp pierwszą małą literę o wielkimi tyłek o

$ X = "Hello World"
$ echo $ x/o/o
Witaj świecie

Wyszukaj i zamień w zmiennej, ale ze wszystkimi dopasowaniami wymienionymi z powodu wiodącego cięcia we wzorze wyszukiwania.

$ X = "Hello World"
$ echo $ x // o/o
Witaj świecie

Wzory, zaczynając od #, oznacz, że dopasowanie musi rozpocząć się na początku ciągu, aby zostać zastąpionym

$ X = "Hello World"
$ echo $ x/#h/j
Jello World

Przykład, w którym poszukiwanie dopasowania na początku ciągu, ale nieudanie, ponieważ dopasowanie jest później w ciągu ciągu

$ X = "Hello World"
$ echo $ x/#w/j
Witaj świecie

Wzory rozpoczynające się od % będą pasować tylko na końcu ciągów, jak w tym przykładzie.

$ X = "Hello World"
$ echo $ x/%d/d dzisiaj
Witam świat dzisiaj

Przykład do końca meczu smyczkowego, który zawodzi, ponieważ dopasowanie znajduje się na początku ciągu.

$ X = "Hello World"
$ echo $ x/%h/dziś
Witaj świecie

Użyj Shopt z Nocasematch, aby wykonywać niewrażliwą wymianę.

$ shopt -s nocasematch
$ X = "Hello World"
$ echo $ x/hello/witam
Witamy świat

Wyłącz sklep z Nocasematch, aby zrobić wymianę wrażliwą na sprawę.

$ shopt -u nocasematch
$ X = "Hello World"
$ echo $ x/hello/witam
Witaj świecie

Wyszukaj zmienne środowiskowe, które pasują do wzoru.

$ My_a = 1
$ My_b = 2
$ My_c = 3
$ echo $ !MÓJ*
My_a my_b my_c

Uzyskaj listę zmiennych pasujących, a następnie zapętla się przez każdą zmienną i wydrukuj jej wartość

$ My_a = 1
$ My_b = 2
$ My_c = 3
$ zmienne = $ !MÓJ*
$ dla I in $ zmienne; echo $ i; echo "$ !skończyłem
My_a
1
MOJE B
2
MOJA C
3

Zrób ciąg wszystkich wielkich

$ X = "Hello World"
$ echo $ x ^^
WITAJ ŚWIECIE
Zrób sznurek wszystkich małych liter
$ X = "Hello World"
$ echo $ x ,,
Witaj świecie
Stwórz pierwszą postać wielkiej sznurka
$ X = „George Washington”
$ echo $ x^
George Washington
Stwórz pierwszą postać sznurka małej litery
$ X = bob
$ echo $ x,
pion

Parametry pozycyjne

Parametry pozycyjne są zwykle uważane za parametry wiersza poleceń, jak je używać, pokazano z przykładami poniżej.

Parametr 0 $ to nazwa skryptu, która jest uruchomiona, a następnie 1 $, 2 $, 3 $ itd. To parametry wiersza poleceń przekazane do skryptu.

skrypt $ cat.cii
Echo 0 $
Echo 1 USD
Echo 2 USD
Echo 3 USD
$ bash ./scenariusz.SH Apple Banana Marchew
./scenariusz.cii
jabłko
banan
marchewka

Parametr $* to pojedyncza zmienna ze wszystkimi połączonymi argumentami wiersza poleceń.

skrypt $ cat.cii
Echo 1 USD
Echo 2 USD
Echo $*
$ bash ./scenariusz.SH Banana Apple
jabłko
banan
Apple Banana

Parametr $# jest liczbą z ilością parametrów pozycji przekazanej do skryptu w tym przypadku poniżej, są 2 argumenty.

skrypt $ cat.cii
Echo 1 USD
Echo 2 USD
Echo $*
Echo $#
$ bash ./scenariusz.SH Banana Apple
jabłko
banan
Apple Banana
2

Rozszerzenie Tylde

Rozszerzenie Tylde jest powszechnie widoczne w przypadku nazw użytkowników i katalogów domowych, przykłady pokazano poniżej.

Rozszerzenie Tylde, aby uzyskać katalog domowy obecnego użytkownika, używając tylko Tilde bez nazwy użytkownika.

$ echo $ użytkownik
źródło
$ cd ~/
$ pwd
/źródło

Zapoznaj się z katalogiem domowym konkretnego użytkownika, a nie bieżącego użytkownika z Tilde i nazwą użytkownika

$ cd ~ Linuxhint
$ pwd
/Home/Linuxhint

Podstawienie arytmetyczne

Podstawienie arytmetyczne umożliwia Bash wykonywanie operacji matematycznych w skorupce lub w skrypcie. Przykłady wspólnych zastosowań pokazano poniżej.

Proste podstawienie arytmetyczne z $ i podwójne nawiasy

$ echo $ ((2 + 3))
5

Operator Post Increment zaktualizuje wartość o jeden po bieżącym poleceniu, Uwaga Uwaga Istnieje równoważne spadanie postów nie pokazano tutaj.

$ X = 2
$ echo $ ((x ++))
2
$ echo x x
3

Operator przed przyrostem zaktualizuje wartość o jeden tuż przed bieżącym polecenie.

$ X = 2
$ echo $ ((++ x))
3
$ echo x x
3

Operator wykładników może zwiększyć liczbę do mocy wykładniczo

$ echo $ ((5 ** 2))
25

Lewa zmiana bitowa; W tym przypadku przesuń bity dziesiętnego numeru 8 na lewo, co zasadniczo go mnoży przez 2

$ echo $ (8<<1))
16

Właściwa zmiana bitowa; W tym przypadku przesuń bity liczby dziesiętnej 8 na prawą, która zasadniczo dzieli liczbę przez 2

$ echo $ ((8 >> 1))
4

Bitwise i operator porównują liczby bit według bit, a wynik będą bity, które są ustawione.

$ echo $ ((4 i 5))
4

Bitwise lub operator porówna liczbę bit według bit, a wyniki będą bity, w których którykolwiek z wejść ma zestaw bitów.

$ echo $ ((4 | 9))
13

Operator równości arytmetycznej przetestuje prawdę i zwróci 1 lub 0

$ echo $ ((4 == 4))
1

Operator nierówności arytmetycznych przetestuje nierówność i zwróci 1 lub 0

$ echo $ (4 != 4))
0

Operator warunkowy przetestuje pierwszy argument, jeśli prawda, zastąp na drugi argument, a jeśli false zamień na trzecim. W tym przypadku 5 równa się 4+1, więc pierwszy warunkowy jest prawdziwy, a 9 jest zwracane. 5 nie równa się 4+2, więc w drugim echo 7 jest zwracany.

$ echo $ ((5 == 4+1 ? 9: 7))
9
$ echo $ ((5 == 4+2 ? 9: 7))
7

Możesz użyć liczb sześciokadciowców w rozszerzeniach arytmetycznych, w tym przypadku 0xa jest równoważne 10 i 10+7 = 17.

$ echo $ ((0xa + 7))
17

Dzielenie słów

Korzystając z zmiennej środowiska IFS do zarejestrowania ogranicznika i za pomocą poleceń odczytu i czytania, możemy analizować ciągi w tablicy tokenów, a następnie policzyć tokeny i działać na nich. Przykłady pokazano poniżej.
Użyj parametru IFS jako ogranicznika, przeczytaj tokeny do tablicy podzielonej przez IFS, który jest ustawiony na znak kosmiczny, a następnie wydrukuj tokeny jeden po drugim

$ text = "Hello World"
$ Ifs = "
$ czytaj -a tokeny <<< "$text"
$ echo "Istnieją $ #tokens [*] słowa w tekście."

W tekście są 2 słowa.

$ dla i w „$ tokens [@]”; echo $ i; zrobione
Cześć
Świat

Czytanie użytkowników bez IFS i określ opieranie w poleceniu ReadArray. Zauważ, że to tylko przykład, w którym podzieliliśmy ścieżkę katalogu na podstawie ogranicznika cięcia. W takim przypadku kod zawiera pusty ciąg przed pierwszym cięciem, który musiałby zostać dostosowany w realnym użyciu, ale tylko pokazujemy, jak wywołać czytanie, aby podzielić ciąg na tokeny w tablicy z ogranicznikiem.

$ path = "/home/linuxhint/usr/local/bin"
$ readArray -d / -t tokeny <<< "$path"
echo "Istnieją $ #tokens [*] słowa w tekście."

W tekście jest 6 słów.

$ dla i w „$ tokens [@]”; echo $ i; zrobione
dom
Linuxhint
USR
lokalny
kosz

Rozszerzenie nazwy pliku

Chcąc odwołać się do listy plików lub katalogów w systemie plików, polecenie bash lub skrypt bash może używać rozszerzenia nazwy pliku do generowania listy plików i katalogów z prostych poleceń. Przykłady pokazano poniżej.

* Znak rozszerza się na kartę wieloznaczną i odbiera wszystkie pasujące pliki z resztą sznurka Wild Card. Tutaj zbieramy wszystkie pliki kończące się .TXT i przekaż je do polecenia DU w celu sprawdzania rozmiaru dysku.

$ dotyk a.txt b.txt c.tekst
$ echo „Hello World”> treść.tekst
$ du *.tekst
0 a.tekst
0 b.tekst
0 c.tekst
4 Treść.tekst

? Postać będzie pasować tylko do jednej postaci, a nie nieskończonej liczby znaków, dlatego w tym przykładzie odbiera tylko pliki plików za pomocą jednej postaci, a następnie .tekst.

$ dotyk a.txt b.txt c.tekst
$ echo „Hello World”> treść.tekst
$ du ?.tekst
0 a.tekst
0 b.tekst
0 c.tekst

Postacie w nawiasach rozszerzają się, aby pasowały do ​​dowolnej postaci. W tym przykładzie a.TXT i c.TXT są odbierane przez rozszerzenie

$ dotyk a.txt b.txt c.tekst
$ echo „Hello World”> treść.tekst
$ du [ac].tekst
0 a.tekst
0 c.tekst

Znaki w nawiasach mogą być gamą znaków i widzimy tutaj wszystkie pliki od zakresu od A do C, a następnie .Sufiks TXT jest odbierany

$ dotyk a.txt b.txt c.tekst
$ echo „Hello World”> treść.tekst
$ du [a-c].tekst
0 a.tekst
0 b.tekst
0 c.tekst

Wniosek

W tym artykule omówiliśmy wiele rodzajów rozszerzeń powłoki i mam nadzieję, że proste przykłady mogą służyć jako książka kucharska dla Bash, abyś był bardziej produktywny dzięki rozszerzeniu powłoki. Jako dalsze odniesienia polecam przeczytanie pełnej instrukcji BASH, a także wiele dobrych artykułów na stronie internetowej Nixcraft na temat scenariuszy Bash, w tym rozszerzenia powłoki. Mamy inne artykuły, które mogą być interesujące na Linuxhint, w tym: 30 przykładów skryptu bash, małe wielkie stry. Mamy również popularny bezpłatny 3 -godzinny kurs programowania Bash, który można znaleźć na YouTube.