Proměnné jsou klíčové pro psaní skriptů a porozumění tomu, jaký dopad bude mít kód, který kopírujete z webu, na váš systém Linux. Pojďme se na to podívat!
Základy proměnných
Proměnné jsou pojmenované symboly, které reprezentují textový řetězec nebo číselnou hodnotu. Pokud je použijete v příkazech a výrazech, systém s nimi pracuje, jako byste přímo zadali jejich hodnotu, nikoli jméno proměnné.
Pro vytvoření proměnné stačí definovat její jméno a přiřadit jí hodnotu. Názvy proměnných by měly být popisné a měly by vám připomínat, co obsahují. Název proměnné nesmí začínat číslicí ani obsahovat mezery, ale může začínat podtržítkem. Můžete použít libovolnou kombinaci alfanumerických znaků (velkých i malých).
Příklady použití
Ukážeme si vytvoření pěti proměnných. Zápis je takový, že zadáte jméno proměnné, pak rovnítko (=) a nakonec její hodnotu. Je důležité si uvědomit, že před ani za rovnítkem není mezera. Přiřazení hodnoty proměnné se nazývá inicializace proměnné.
Vytvoříme čtyři textové proměnné (řetězce) a jednu číselnou, nazvanou `this_year`:
me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019
Pro
zobrazení hodnoty
proměnné použijte příkaz `echo`. Kdykoli chcete použít hodnotu proměnné, musíte před jejím jménem uvést znak dolaru `$`, jak je ukázáno níže:
echo $my_name
echo $my_boost
echo $this_year
Použijme všechny naše proměnné najednou:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
Hodnoty proměnných nahradí jejich názvy. Můžete také měnit hodnoty proměnných. Pro přiřazení nové hodnoty proměnné `my_boost` jednoduše zopakujete proces přiřazení její první hodnoty, například takto:
my_boost=Tequila
Pokud nyní znovu spustíte předchozí příkaz, dostanete jiný výsledek:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
Můžete tedy použít stejný příkaz odkazující na stejné proměnné a získat různé výsledky v závislosti na tom, jaké hodnoty jsou v proměnných uloženy.
O citování proměnných si povíme později. Nyní si zapamatujte několik důležitých bodů:
S proměnnou v jednoduchých uvozovkách se zachází jako s doslovným řetězcem, ne jako s proměnnou.
S proměnnými v dvojitých uvozovkách se zachází jako s proměnnými.
Pro získání hodnoty proměnné musíte zadat znak dolaru `$`.
Proměnná bez znaku dolaru `$` vrací jenom svůj název.
Můžete také vytvořit proměnnou, která získá svoji hodnotu z jiné existující proměnné nebo několika proměnných. Následující příkaz definuje novou proměnnou s názvem `drink_of_the_Year` a přiřadí jí kombinovanou hodnotu proměnných `my_boost` a `this_year`:
drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year
Jak používat proměnné ve skriptech
Skripty by bez proměnných prakticky nemohly fungovat. Proměnné poskytují flexibilitu, která umožňuje, aby skript byl obecným řešením, nikoli specifickým. Pro ilustraci rozdílu si ukážeme skript, který počítá soubory v adresáři `/dev`.
Zkopírujte následující kód do textového souboru a uložte jej jako `fcnt.sh` (zkratka pro „file count“):
#!/bin/bash folder_to_count=/dev file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count
Než budete moci skript spustit, musíte jej nastavit jako spustitelný, takto:
chmod +x fcnt.sh
Pro spuštění skriptu zadejte:
./fcnt.sh
Skript zobrazí počet souborů v adresáři `/dev`. Funguje takto:
Je definována proměnná `folder_to_count` a je jí přiřazen řetězec `“/dev“`.
Dále je definována proměnná `file_count`. Tato proměnná získá svou hodnotu ze substituce příkazu, tedy z výrazu uvnitř `$()`. Všimněte si, že před první závorkou je znak dolaru `$`. Tato konstrukce `$()` vyhodnotí příkazy uvnitř závorek a vrátí jejich výsledek. V tomto případě se tento výsledek přiřadí proměnné `file_count`. Co se týká proměnné `file_count`, ta přijme hodnotu, která se má uložit, bez ohledu na to, jak se tato hodnota vypočítala.
Příkaz vyhodnocený uvnitř substituce příkazu provede výpis souborů pomocí `ls` v adresáři určeném proměnnou `folder_to_count`, což je `“/dev“`. Skript tedy spustí příkaz `ls /dev`.
Výstup tohoto příkazu se přesměruje do příkazu `wc`. Volba `-l` (počet řádků) způsobí, že `wc`
spočítá počet řádků
ve výstupu příkazu `ls`. Protože je každý soubor zobrazen na samostatném řádku, jedná se o celkový počet souborů a podadresářů v adresáři `/dev`. Tato hodnota se přiřadí proměnné `file_count`.
Poslední řádek pomocí `echo` vypíše výsledek.
Ale tento skript funguje pouze pro adresář `“/dev“`. Jak můžeme zajistit, aby skript pracoval s libovolným adresářem? Stačí jen malá úprava.
Jak používat parametry příkazového řádku ve skriptech
Mnoho příkazů, jako `ls` a `wc`, přijímá parametry příkazového řádku. Tyto parametry poskytují příkazu informace, aby věděl, co má dělat. Pokud chcete, aby `ls` fungoval ve vašem domovském adresáři a
zobrazoval také skryté soubory, můžete použít následující příkaz, kde `~` (tilda) a volba `-a` (all) jsou parametry příkazového řádku:
ls ~ -a
Naše skripty mohou také přijímat parametry příkazového řádku. Ty se označují jako `$1` pro první parametr, `$2` pro druhý atd., až po `$9` pro devátý parametr. (Ve skutečnosti existuje i `$0`, ale ten je vyhrazen pro název skriptu.)
Na parametry příkazového řádku můžete odkazovat ve skriptu stejně jako na běžné proměnné. Upravme náš skript, jak je uvedeno níže, a uložme jej pod novým názvem `fcnt2.sh`:
#!/bin/bash folder_to_count=$1 file_count=$(ls $folder_to_count | wc -l) echo $file_count files in $folder_to_count
Tentokrát je proměnné `folder_to_count` přiřazena hodnota prvního parametru příkazového řádku, tedy `$1`.
Zbytek skriptu funguje přesně jako předtím. Nyní je váš skript obecný, nikoli specifický. Můžete jej použít pro jakýkoli adresář, protože není pevně určen pouze pro práci s `/dev`.
Zde je postup, jak nastavit skript jako spustitelný:
chmod +x fcnt2.sh
Nyní si to vyzkoušejte s různými adresáři. Nejprve můžete zkusit `/dev`, abyste se ujistili, že dostanete stejný výsledek jako dříve. Zadejte následující:
./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin
Pro adresář `/dev` získáte stejný výsledek (207 souborů) jako dříve. To je povzbudivé a pro každý z ostatních parametrů příkazového řádku dostanete specifické výsledky.
Pro zkrácení skriptu se můžete obejít zcela bez proměnné `folder_to_count` a pouze odkazovat na `$1`, takto:
#!/bin/bash file_count=$(ls $1 wc -l) echo $file_count files in $1
Práce se speciálními proměnnými
Zmínili jsme `$0`, která je vždy nastavena na název souboru skriptu. To vám umožňuje používat skript k provádění akcí, jako je správný výpis jeho názvu i v případě jeho přejmenování. To je užitečné v situacích, kdy chcete znát název procesu, který přidal záznam.
Zde jsou další speciální předdefinované proměnné:
`$#`: Kolik parametrů příkazového řádku bylo předáno skriptu.
`[email protected]`: Všechny parametry příkazového řádku předané skriptu.
`$?:` Stav ukončení posledního spuštěného procesu.
`$$`: ID procesu (PID) aktuálního skriptu.
`$USER`: Uživatelské jméno uživatele, který spustil skript.
`$HOSTNAME`: Název hostitele počítače, na kterém je spuštěn skript.
`$SECONDS`: Počet sekund, po které byl skript spuštěn.
`$RANDOM`: Vrací náhodné číslo.
`$LINENO`: Vrátí aktuální číslo řádku skriptu.
Chcete je vidět všechny v jednom skriptu? Můžete! Uložte následující text jako textový soubor s názvem `special.sh`:
#!/bin/bash echo "There were $# command line parameters" echo "They are: [email protected]" 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"
Zadejte následující, aby byl skript spustitelný:
chmod +x special.sh
Nyní jej můžete spustit s různými parametry příkazového řádku, jak je znázorněno níže.
Proměnné prostředí
Bash používá proměnné prostředí pro definování a ukládání informací o prostředí, které vytváří při spuštění. Tyto proměnné obsahují informace, ke kterým má Bash snadný přístup, jako je vaše uživatelské jméno, jazykové nastavení, počet příkazů, které se ukládají v historii, váš výchozí editor a mnoho dalšího.
Chcete-li zobrazit aktivní proměnné prostředí ve vaší relaci Bash, použijte tento příkaz:
env | less
Při procházení seznamu možná narazíte na některé, které by mohly být užitečné ve vašich skriptech.
Jak exportovat proměnné
Když se spustí skript, běží ve svém vlastním procesu a proměnné, které používá, nejsou viditelné mimo tento proces. Pokud chcete proměnnou sdílet s jiným skriptem, který váš skript spouští, musíte tuto proměnnou exportovat. Ukážeme vám, jak na to pomocí dvou skriptů.
Nejprve uložte následující text do souboru s názvem `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"
Tím se vytvoří dvě proměnné, `first_var` a `second_var`, a přiřadí se jim nějaké hodnoty. Vytiskne je do okna terminálu, exportuje proměnné a zavolá `script_two.sh`. Když `script_two.sh` skončí a proces se vrátí do tohoto skriptu, znovu vypíše proměnné do okna terminálu. Poté můžete vidět, zda se změnily.
Druhý skript, který použijeme, je `script_two.sh`. Tento skript volá `script_one.sh`. Zadejte následující:
#!/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"
Tento druhý skript vypíše hodnoty dvou proměnných, přiřadí jim nové hodnoty a poté je znovu vypíše.
Chcete-li spustit tyto skripty, musíte zadat následující příkazy, aby byly spustitelné:
chmod +x script_one.sh chmod +x script_two.sh
A nyní zadejte následující pro spuštění `script_one.sh`:
./script_one.sh
Výstup nám říká následující:
`script_one.sh` vypíše hodnoty proměnných, které jsou `alpha` a `bravo`.
`script_two.sh` vypíše hodnoty proměnných (`alpha` a `bravo`), tak jak je převzal.
`script_two.sh` změní hodnoty na `charlie` a `delta`.
`script_one.sh` vypíše hodnoty proměnných, které zůstávají `alpha` a `bravo`.
To, co se stane ve druhém skriptu, zůstane ve druhém skriptu. Je to, jako by kopie proměnných byly poslány do druhého skriptu, ale byly zrušeny, jakmile skript skončil. Původní proměnné v prvním skriptu se nemění tím, co se stane s jejich kopiemi ve druhém skriptu.
Jak citovat proměnné
Možná jste si všimli, že když skripty odkazují na proměnné, jsou v dvojitých uvozovkách. To umožňuje správné odkazování na proměnné tak, aby se jejich hodnoty použily při spouštění příkazů ve skriptu.
Pokud hodnota, kterou přiřazujete proměnné, obsahuje mezery, musí být přiřazení proměnné také v uvozovkách. Je to proto, že Bash standardně používá mezeru jako oddělovač.
Zde je příklad:
site_name=How-To Geek
Bash vidí mezeru před `Geek` jako znamení, že začíná nový příkaz. Nahlásí, že takový příkaz neexistuje a ukončí řádek. `echo` ukazuje, že proměnná `site_name` neobsahuje nic – dokonce ani text `How-To`.
Zkuste to znovu s uvozovkami kolem hodnoty, jak je uvedeno níže:
site_name="How-To Geek"
Tentokrát je text rozpoznán jako jedna hodnota a správně přiřazen k proměnné `site_name`.
Příkaz `echo` je váš pomocník
Může chvíli trvat, než si zvyknete na substituci příkazů, citování proměnných a zapamatování si, kdy zahrnout znak dolaru.
Než stisknete klávesu Enter a provedete řádek příkazů Bash, zkuste to s příkazem `echo` před ním. Tímto způsobem se můžete ujistit, že se stane to, co chcete. Můžete také odhalit případné chyby v syntaxi.