Ś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.