Jak pracovat s proměnnými v Bash

Proměnné jsou životně důležité, pokud chcete psát skripty a pochopit, co kód, který se chystáte vyjmout a vložit z webu, udělá s vaším počítačem se systémem Linux. Začneme!

Proměnné 101

Proměnné jsou pojmenované symboly, které představují řetězec nebo číselnou hodnotu. Když je použijete v příkazech a výrazech, zachází se s nimi, jako byste místo názvu proměnné zadali hodnotu, kterou obsahují.

Chcete-li vytvořit proměnnou, stačí zadat její název a hodnotu. Názvy proměnných by měly být popisné a měly by vám připomínat hodnotu, kterou mají. Název proměnné nemůže začínat číslem ani nemůže obsahovat mezery. Může však začínat podtržítkem. Kromě toho můžete použít jakoukoli kombinaci velkých a malých alfanumerických znaků.

Příklady

Zde vytvoříme pět proměnných. Formát je zadání názvu, rovnítka = a hodnoty. Všimněte si, že před nebo za rovnítkem není mezera. Přidělení hodnoty proměnné se často označuje jako přiřazení hodnoty proměnné.

Vytvoříme čtyři řetězcové proměnné a jednu číselnou proměnnou, this_year:

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

Na viz hodnotu v proměnné, použijte příkaz echo. Vždy, když odkazujete na hodnotu, kterou obsahuje, musíte před názvem proměnné uvést znak dolaru $, jak je znázorněno níže:

echo $my_name
echo $my_boost
echo $this_year

The

Použijme všechny naše proměnné najednou:

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

The

Hodnoty proměnných nahrazují jejich názvy. Můžete také změnit hodnoty proměnných. Chcete-li proměnné přiřadit novou hodnotu my_boost, stačí zopakovat to, co jste udělali, když jste přiřadili její první hodnotu, například takto:

my_boost=Tequila

The

Pokud znovu spustíte předchozí příkaz, získáte nyní jiný výsledek:

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

echo

Můžete tedy použít stejný příkaz, který odkazuje na stejné proměnné, a získat jiné výsledky, pokud změníte hodnoty obsažené v proměnných.

O citování proměnných si povíme později. Zde je několik věcí k zapamatování:

S proměnnou v jednoduchých uvozovkách se zachází jako s doslovným řetězcem, nikoli jako s proměnnou.
S proměnnými v uvozovkách “ se zachází jako s proměnnými.
Chcete-li získat hodnotu v proměnné, musíte zadat znak dolaru $.
Proměnná bez znaku dolaru $ poskytuje pouze název proměnné.

Můžete také vytvořit proměnnou, která převezme svou hodnotu z existující proměnné nebo počtu proměnných. Následující příkaz definuje novou proměnnou nazvanou drink_of_the_Year a přiřadí jí kombinované hodnoty proměnných my_boost a this_year:

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

Nápoj roku=

Jak používat proměnné ve skriptech

Skripty by byly bez proměnných zcela ochromeny. Proměnné poskytují flexibilitu, díky níž je skript obecným, spíše než konkrétním řešením. Pro ilustraci rozdílu je zde skript, který počítá soubory v adresáři /dev.

  Jak poslouchat rádio na ploše Linuxu s Gradio

Zadejte toto do textového souboru a poté jej uložte jako fcnt.sh (pro „počet souborů“):

#!/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 spustit skript, musíte jej nastavit jako spustitelný, jak je znázorněno níže:

chmod +x fcnt.sh

Pro spuštění skriptu zadejte následující:

./fcnt.sh

Tím se vypíše počet souborů v adresáři /dev. Funguje to takto:

Je definována proměnná s názvem folder_to_count a je nastavena tak, aby obsahovala řetězec „/dev“.
Je definována další proměnná s názvem file_count. Tato proměnná přebírá svou hodnotu ze substituce příkazu. Toto je příkazová fráze mezi závorkami $(). Všimněte si, že před první závorkou je znak dolaru $. Tato konstrukce $() vyhodnotí příkazy v závorkách a poté vrátí jejich konečnou hodnotu. V tomto příkladu je tato hodnota přiřazena proměnné počet_souborů. Pokud jde o proměnnou počet_souborů, je předána hodnota, která se má ponechat; nezajímá se o to, jak byla hodnota získána.
Příkaz vyhodnocený v substituci příkazu provede výpis souboru ls v adresáři v proměnné folder_to_count, která byla nastavena na „/dev.“ Skript tedy provede příkaz „ls /dev“.
Výstup z tohoto příkazu je přenesen do příkazu wc. Volba -l (počet řádků) způsobí, že wc to spočítat počet řádků ve výstupu z příkazu ls. Protože je každý soubor uveden na samostatném řádku, jedná se o počet souborů a podadresářů v adresáři „/dev“. Tato hodnota je přiřazena proměnné počet_souborů.
Poslední řádek používá k výstupu výsledku echo.

Ale to funguje pouze pro adresář „/dev“. Jak můžeme zajistit, aby skript fungoval s libovolným adresářem? Stačí jedna malá změna.

Jak používat parametry příkazového řádku ve skriptech

Mnoho příkazů, jako je ls a wc, přebírá parametry příkazového řádku. Ty poskytují informace příkazu, takže ví, co chcete, aby udělal. Pokud chcete, aby ls pracoval ve vašem domovském adresáři a také pro zobrazení skrytých souborů, 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 přijímat parametry příkazového řádku. Jsou uváděny jako $1 pro první parametr, $2 jako druhý atd., až do $9 pro devátý parametr. (Ve skutečnosti je tam také 0 $, ale to je vyhrazeno pro vždy držení skriptu.)

Na parametry příkazového řádku můžete ve skriptu odkazovat 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, $1.

Zbytek skriptu funguje přesně jako předtím. Spíše než konkrétním řešením je nyní váš skript obecný. Můžete jej použít v libovolném adresáři, protože není pevně naprogramován pro práci pouze s „/dev“.

  Jak získat aplikaci Apple TV mimo region USA

Zde je návod, jak vytvořit skript spustitelný:

chmod +x fcnt2.sh

Nyní to zkuste s několika adresáři. Nejprve můžete provést „/dev“, abyste se ujistili, že získáte stejný výsledek jako dříve. Zadejte následující:

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

Získáte stejný výsledek (207 souborů) jako dříve pro adresář „/dev“. To je povzbudivé a pro každý z ostatních parametrů příkazového řádku získáte výsledky specifické pro adresář.

Chcete-li skript zkrátit, můžete se obejít bez proměnné folder_to_count úplně a pouze odkazovat na $1, a to následovně:

#!/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í věcí, jako je správné vytištění jeho názvu, i když je přejmenován. To je užitečné v situacích protokolování, kdy chcete znát název procesu, který přidal záznam.

Následují další speciální přednastavené 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 spouštějícího 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, že? Můžeš! 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 spustitelný:

chmod +x special.sh

Nyní jej můžete spustit s řadou různých parametrů příkazového řádku, jak je znázorněno níže.

Proměnné prostředí

Bash používá proměnné prostředí k definování a záznamu vlastností prostředí, které vytváří při spuštění. Tyto uchovávají informace, ke kterým má Bash snadno přístup, jako je vaše uživatelské jméno, národní prostředí, počet příkazů, které může pojmout váš soubor historie, váš výchozí editor a mnoho dalšího.

Chcete-li zobrazit aktivní proměnné prostředí v relaci Bash, použijte tento příkaz:

env | less

The

Pokud projdete seznamem, možná najdete některé, které by bylo užitečné ve vašich skriptech odkazovat.

Jak exportovat proměnné

Když se skript spustí, je ve svém vlastním procesu a proměnné, které používá, nelze vidět 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ů.

  Jak přemapovat tlačítko Bixby na Samsung Galaxy S8/S8+ [No Root]

Nejprve uložte následující 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 vytiskne proměnné do okna terminálu. Pak můžete vidět, zda se změnili.

Druhý skript, který použijeme, je script_two.sh. Toto je skript, který 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 vytiskne hodnoty dvou proměnných, přiřadí jim nové hodnoty a poté je znovu vytiskne.

Chcete-li spustit tyto skripty, musíte zadat následující, 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

Toto nám říká výstup:

script_one.sh vypíše hodnoty proměnných, kterými jsou alfa a bravo.
script_two.sh vypíše hodnoty proměnných (alfa a bravo), jak je přijal.
script_two.sh je změní na charlie a delta.
script_one.sh vypíše hodnoty proměnných, které jsou stále alfa a bravo.

Co se stane ve druhém scénáři, zůstane ve druhém scénáři. Je to jako kdyby byly kopie proměnných odeslány do druhého skriptu, ale byly zahozeny, když skript skončí. Původní proměnné v prvním skriptu nejsou změněny ničím, co se stane s jejich kopiemi ve druhém.

Jak citovat proměnné

Možná jste si všimli, že když skripty odkazují na proměnné, jsou v uvozovkách “. To umožňuje správné odkazování na proměnné, takže jejich hodnoty se použijí při spuštění řádku ve skriptu.

Pokud hodnota, kterou přiřadíte proměnné, obsahuje mezery, musí být při přiřazování k proměnné v uvozovkách. Je to proto, že ve výchozím nastavení používá Bash jako oddělovač mezeru.

Zde je příklad:

site_name=How-To Geek

Bash vidí mezeru před „Geek“ jako znamení, že začíná nový příkaz. Hlásí, že žádný takový příkaz neexistuje, a opustí linku. echo nám ukazuje, že proměnná site_name neobsahuje nic – dokonce ani text „Jak na to“.

Zkuste to znovu s uvozovkami kolem hodnoty, jak je znázorněno níže:

site_name="How-To Geek"

site_name=

Tentokrát je rozpoznán jako jedna hodnota a správně přiřazen k proměnné site_name.

echo je tvůj přítel

Může chvíli trvat, než si zvyknete na příkazy substituce, citování proměnných a zapamatování si, kdy zahrnout znak dolaru.

Než stisknete Enter a provedete řádek Bash příkazů, zkuste to s echem před ním. Tímto způsobem se můžete ujistit, že to, co se stane, je to, co chcete. Můžete také zachytit chyby, které jste udělali v syntaxi.