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
Aby zobaczyć wartość przechowywaną 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
Użyjmy wszystkich naszych zmiennych naraz:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
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
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"
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.
- Zmienna w cudzysłowie jest traktowana jako zmienna.
- Aby uzyskać wartość przechowywaną w zmiennej, musisz podać znak dolara $.
- Zmienna bez znaku dolara $ podaje tylko nazwę zmiennej.
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
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
. - Polecenie oceniane podczas podstawiania poleceń wykonuje listę plików
ls
w katalogu w zmiennejfolder_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, żewc
liczy liczbę linii w danych wyjściowych polecenials
. - 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 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:
./fcnt2.sh /dev
./fcnt2.sh /etc
./fcnt2.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
Jeśli przewiniesz listę, możesz znaleźć coś, do czego przydałoby się odniesienie w twoich skryptach.
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 script_two.sh
. Kiedy script_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.sh
. 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ć script_one.sh
:
./script_one.sh
Oto, co mówi nam wyjście:
script_one.sh
wypisuje wartości zmiennych, które są alpha i bravo.script_two.sh
wyświetla wartości zmiennych (alpha 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ą alpha 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"
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.
newsblog.pl