Jak pracować ze zmiennymi w Bash

Zmienne są niezbędne, jeśli chcesz pisać skrypty i zrozumieć, co kod, który zamierzasz wyciąć i wkleić z sieci, zrobi na Twoim komputerze z systemem Linux. Pomożemy Ci zacząć!

Zmienne 101

Zmienne to nazwane symbole, które reprezentują ciąg lub wartość liczbową. Kiedy używasz ich w poleceniach i wyrażeniach, są traktowane tak, jakbyś wpisał wartość, którą przechowują, zamiast nazwy zmiennej.

Aby utworzyć zmienną, wystarczy podać jej nazwę i wartość. Nazwy zmiennych powinny być opisowe i przypominać o wartości, jaką mają. Nazwa zmiennej nie może zaczynać się od liczby ani nie może zawierać spacji. Może jednak zaczynać się od podkreślenia. Oprócz tego możesz użyć dowolnej kombinacji wielkich i małych liter alfanumerycznych.

Przykłady

Tutaj utworzymy pięć zmiennych. Format polega na wpisaniu nazwy, znaku równości = i wartości. Zauważ, że nie ma spacji przed lub po znaku równości. Nadanie zmiennej wartości jest często nazywane przypisaniem wartości do zmiennej.

Stworzymy cztery zmienne łańcuchowe i jedną zmienną numeryczną, ten_rok:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Pięć zmiennych w oknie terminala.

Do zobacz wartość trzymane w zmiennej, użyj polecenia echo. Za każdym razem, gdy odwołujesz się do zawartej w niej wartości, musisz poprzedzić nazwę zmiennej znakiem dolara, jak pokazano poniżej:

echo $my_name
echo $my_boost
echo $this_year

Plik

Użyjmy wszystkich naszych zmiennych naraz:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Plik

Wartości zmiennych zastępują ich nazwy. Możesz także zmienić wartości zmiennych. Aby przypisać nową wartość do zmiennej my_boost, po prostu powtórz to, co zrobiłeś, przypisując jej pierwszą wartość, na przykład:

my_boost=Tequila

Plik

Jeśli ponownie uruchomisz poprzednie polecenie, otrzymasz teraz inny wynik:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Echo

Możesz więc użyć tego samego polecenia, które odwołuje się do tych samych zmiennych i uzyskać różne wyniki, jeśli zmienisz wartości przechowywane w zmiennych.

O cytowaniu zmiennych porozmawiamy później. Na razie kilka rzeczy, o których należy pamiętać:

Zmienna w apostrofach ”jest traktowana jako ciąg literału, a nie jako zmienna.
Zmienne w cudzysłowie ”są traktowane jako zmienne.
Aby uzyskać wartość przechowywaną w zmiennej, musisz podać znak dolara $.
Zmienna bez znaku dolara $ podaje tylko nazwę zmiennej.

Prawidłowe i niepoprawne przykłady odwołań do zmiennych w oknie terminala.

Możesz również utworzyć zmienną, która pobierze wartość z istniejącej zmiennej lub liczby zmiennych. Następujące polecenie definiuje nową zmienną o nazwie drink_of_the_Year i przypisuje jej połączone wartości zmiennych my_boost i this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Drink_of-the_Year =

Jak używać zmiennych w skryptach

Skrypty byłyby całkowicie ograniczone bez zmiennych. Zmienne zapewniają elastyczność, która sprawia, że ​​skrypt jest rozwiązaniem ogólnym, a nie konkretnym. Aby zilustrować różnicę, oto skrypt zliczający pliki w katalogu / dev.

Wpisz to do pliku tekstowego, a następnie zapisz jako fcnt.sh (dla „liczby plików”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Zanim uruchomisz skrypt, musisz uczynić go wykonywalnym, jak pokazano poniżej:

chmod +x fcnt.sh

Wpisz następujące polecenie, aby uruchomić skrypt:

./fcnt.sh

Wyświetla liczbę plików w katalogu / dev. Oto jak to działa:

Zdefiniowana jest zmienna o nazwie folder_to_count, która zawiera ciąg „/ dev”.
Zdefiniowano inną zmienną o nazwie file_count. Ta zmienna bierze swoją wartość z podstawienia polecenia. To jest fraza polecenia między nawiasami $ (). Zauważ, że przed pierwszym nawiasem znajduje się znak dolara $. Ta konstrukcja $ () ocenia polecenia w nawiasach, a następnie zwraca ich ostateczną wartość. W tym przykładzie ta wartość jest przypisana do zmiennej file_count. Jeśli chodzi o zmienną file_count, jest przekazywana wartość do zatrzymania; nie ma znaczenia, w jaki sposób wartość została uzyskana.
Polecenie oceniane podczas podstawiania poleceń wykonuje listę plików ls w katalogu w zmiennej folder_to_count, która została ustawiona na „/ dev”. Tak więc skrypt wykonuje polecenie „ls / dev”.
Dane wyjściowe tego polecenia są przesyłane potokiem do polecenia wc. Opcja -l (liczba linii) powoduje, że wc policz liczbę linii w danych wyjściowych polecenia ls. Ponieważ każdy plik jest wymieniony w osobnym wierszu, jest to liczba plików i podkatalogów w katalogu „/ dev”. Ta wartość jest przypisywana do zmiennej file_count.
Ostatni wiersz wykorzystuje echo do wyprowadzenia wyniku.

Ale działa to tylko dla katalogu „/ dev”. Jak możemy sprawić, by skrypt działał z dowolnym katalogiem? Wystarczy jedna mała zmiana.

Jak używać parametrów wiersza poleceń w skryptach

Wiele poleceń, takich jak ls i wc, przyjmuje parametry wiersza poleceń. Dostarczają one informacji do polecenia, więc wie, co ma zrobić. Jeśli chcesz, aby ls działał w twoim katalogu domowym i także aby pokazać ukryte pliki, możesz użyć następującego polecenia, gdzie tylda ~ i opcja -a (all) są parametrami wiersza poleceń:

ls ~ -a

Nasze skrypty akceptują parametry wiersza poleceń. Są one określane jako $ 1 dla pierwszego parametru, $ 2 jako drugi i tak dalej, aż do 9 $ dla dziewiątego parametru. (Właściwie jest też 0 $, ale to jest zarezerwowane, aby zawsze przechowywać skrypt).

Możesz odwoływać się do parametrów wiersza poleceń w skrypcie, tak jak do zwykłych zmiennych. Zmodyfikujmy nasz skrypt, jak pokazano poniżej, i zapiszmy go pod nową nazwą fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Tym razem zmiennej folder_to_count jest przypisywana wartość pierwszego parametru wiersza poleceń, $ 1.

Reszta skryptu działa dokładnie tak, jak wcześniej. Zamiast konkretnego rozwiązania, Twój skrypt jest teraz ogólny. Możesz go używać w dowolnym katalogu, ponieważ nie jest zakodowany na stałe do pracy tylko z „/ dev”.

Oto jak sprawić, by skrypt był wykonywalny:

chmod +x fcnt2.sh

Teraz wypróbuj to z kilkoma katalogami. Możesz najpierw użyć „/ dev”, aby upewnić się, że otrzymasz taki sam wynik jak poprzednio. Wpisz następujące informacje:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Otrzymasz taki sam wynik (207 plików) jak poprzednio dla katalogu „/ dev”. Jest to zachęcające i otrzymujesz wyniki specyficzne dla katalogu dla każdego z pozostałych parametrów wiersza poleceń.

Aby skrócić skrypt, możesz całkowicie zrezygnować ze zmiennej folder_to_count i po prostu odnosić się do $ 1 w następujący sposób:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Praca ze zmiennymi specjalnymi

Wspomnieliśmy o $ 0, które zawsze jest ustawione na nazwę pliku skryptu. Dzięki temu możesz używać skryptu do wykonywania takich czynności, jak prawidłowe drukowanie jego nazwy, nawet jeśli została zmieniona. Jest to przydatne w sytuacjach logowania, w których chcesz poznać nazwę procesu, który dodał wpis.

Poniżej znajdują się inne specjalne wstępnie ustawione zmienne:

$ #: Ile parametrów wiersza poleceń zostało przekazanych do skryptu.
$ @: Wszystkie parametry wiersza poleceń przekazane do skryptu.
$ ?: Status zakończenia ostatniego uruchomionego procesu.
$$: identyfikator procesu (PID) bieżącego skryptu.
$ USER: nazwa użytkownika wykonującego skrypt.
$ HOSTNAME: nazwa hosta komputera, na którym działa skrypt.
$ SECONDS: Liczba sekund, przez które skrypt działał.
$ RANDOM: Zwraca liczbę losową.
$ LINENO: Zwraca numer bieżącego wiersza skryptu.

Chcesz zobaczyć je wszystkie w jednym scenariuszu, prawda? Możesz! Zapisz poniższy plik jako plik tekstowy o nazwie special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Wpisz następujące polecenie, aby był wykonywalny:

chmod +x special.sh

Teraz możesz go uruchomić z kilkoma różnymi parametrami wiersza poleceń, jak pokazano poniżej.

Zmienne środowiska

Bash używa zmiennych środowiskowych do definiowania i rejestrowania właściwości środowiska, które tworzy podczas uruchamiania. Te informacje o przechowywaniu, do których Bash ma łatwy dostęp, takie jak nazwa użytkownika, ustawienia regionalne, liczba poleceń, które może przechowywać plik historii, domyślny edytor i wiele innych.

Aby zobaczyć aktywne zmienne środowiskowe w sesji Bash, użyj tego polecenia:

env | less

Plik

Jeśli przewiniesz listę, możesz znaleźć coś, do czego przydałoby się odniesienie w twoich skryptach.

Lista aktywnych zmiennych środowiskowych w oknie terminala.

Jak eksportować zmienne

Uruchomiony skrypt znajduje się w swoim własnym procesie, a używane przez niego zmienne nie mogą być widoczne poza tym procesem. Jeśli chcesz udostępnić zmienną innemu skryptowi, który uruchamia twój skrypt, musisz wyeksportować tę zmienną. Pokażemy Ci, jak to zrobić za pomocą dwóch skryptów.

Najpierw zapisz następujące pliki pod nazwą script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Tworzy to dwie zmienne, first_var i second_var, i przypisuje pewne wartości. Wyświetla je w oknie terminala, eksportuje zmienne i wywołuje skrypt_two.sh. Kiedy skrypt_two.sh kończy działanie i przepływ procesu powraca do tego skryptu, ponownie wyświetla zmienne w oknie terminala. Następnie możesz zobaczyć, czy się zmieniły.

Drugi skrypt, którego użyjemy, to script_two.sh. To jest skrypt, który wywołuje script_one.shc. Wpisz następujące informacje:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Ten drugi skrypt wypisuje wartości dwóch zmiennych, przypisuje im nowe wartości, a następnie drukuje je ponownie.

Aby uruchomić te skrypty, musisz wpisać następujące polecenie, aby były wykonywalne:

chmod +x script_one.sh
chmod +x script_two.sh

A teraz wpisz następujące polecenie, aby uruchomić skrypt_one.sh:

./script_one.sh

Oto, co mówi nam wyjście:

script_one.sh wypisuje wartości zmiennych, które są alfa i bravo.
script_two.sh wyświetla wartości zmiennych (alfa i bravo) w takiej postaci, w jakiej je otrzymał.
script_two.sh zmienia je na charlie i delta.
script_one.sh wypisuje wartości zmiennych, które nadal są alfa i bravo.

To, co dzieje się w drugim scenariuszu, pozostaje w drugim scenariuszu. To tak, jakby kopie zmiennych były wysyłane do drugiego skryptu, ale są odrzucane, gdy skrypt kończy pracę. Oryginalne zmienne w pierwszym skrypcie nie są zmieniane przez nic, co dzieje się z ich kopiami w drugim.

Jak cytować zmienne

Być może zauważyłeś, że kiedy skrypty odwołują się do zmiennych, są one w cudzysłowie ”. Umożliwia to prawidłowe odwoływanie się do zmiennych, więc ich wartości są używane, gdy wiersz jest wykonywany w skrypcie.

Jeśli wartość przypisywana do zmiennej zawiera spacje, podczas przypisywania ich do zmiennej muszą one znajdować się w cudzysłowie. Dzieje się tak, ponieważ Bash domyślnie używa spacji jako separatora.

Oto przykład:

site_name=newsblog.pl

Bash widzi spację przed „Geek” jako wskazówkę, że rozpoczyna się nowe polecenie. Informuje, że nie ma takiego polecenia i opuszcza linię. echo pokazuje nam, że zmienna site_name nic nie zawiera – nawet tekst „How-To”.

Spróbuj jeszcze raz, umieszczając wartość w cudzysłowie, jak pokazano poniżej:

site_name="newsblog.pl"

site_name =

Tym razem jest rozpoznawany jako pojedyncza wartość i poprawnie przypisywany do zmiennej site_name.

echo jest twoim przyjacielem

Przyzwyczajenie się do podstawiania poleceń, cytowania zmiennych i pamiętania, kiedy należy dołączyć znak dolara, może zająć trochę czasu.

Zanim naciśniesz Enter i wykonasz linię poleceń Bash, wypróbuj ją z echo przed nim. W ten sposób możesz upewnić się, że to, co się wydarzy, jest tym, czego chcesz. Możesz także wyłapać wszelkie błędy popełnione w składni.