Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Skriptování v Bashi - Uživatelský vstup a početní operace

V předchozí lekci, Skriptování v Bashi - Proměnné, jsme se naučili základy proměnného prostředí v Bashi. Jak systémových tak i lokálních ve skriptu.

V tomto tutoriálu skriptování v Bashi se zaměříme na uživatelský vstup. Jedná se o jednu z nejdůležitějších věcí při skriptování v Linuxu. Náš skript tím posuneme ze statického kódu na dynamický, kdy uživatel sám ovlivňuje, jaký výstup ze skriptu získá. V závěru si pak projdeme základní matematické operace.

Příkaz read

Interakci s uživatelem si na systému vynutíme příkazem read. Zkusme si nyní vyžádat od uživatele zadání jeho jména, které následně využijeme v textu:

#!/bin/bash

echo "Zadejte uživatelské jméno:"
read JMENO

echo "Vaše jméno je $JMENO"

Po spuštění tohoto skriptu se do konzole nejprve vypíše věta Zadejte uživatelské jméno: a na dalším řádku bude čekat výzva k zadání vstupu. Tento vstup se uloží do proměnné JMENO a můžeme ho následně využívat v kódu.

Pokud chceme tyto dva řádky spojit, stačí k read přidat přepínač -p (prompt):

#!/bin/bash

read -p "Zadejte uživatelské jméno: " JMENO

echo "Vaše jméno je $JMENO"

Název proměnné umístíme na konec řádku za uvozovky. Tím Bash pozná, že uživatelský vstup má uložit právě tam. Někdy není vhodné, aby uživatelský vstup mohl přečíst každý, kdo zrovna uživateli kouká přes rameno. Např. při zadávání hesla nebo jiných citlivých informací. K tomu nám poslouží přepínač -s (silence), který skryje vše, co do terminálu napíšeme. Stejně jako když např. zadáváme heslo při použití příkazu sudo:

#!/bin/bash

read -p "Zadejte uživatelské jméno: " JMENO
read -sp "zadejte heslo: " HESLO

echo "Vaše jméno je $JMENO"
echo "Vaše heslo je $HESLO"

Přepínač -sp je třeba zadat v tomto pořadí. Pokud písmenka prohodíme, nebude fungovat.

Mnohonásobný vstup

Příkaz read nám dává více možností využití. Jednou z nich je např. mnohonásobný vstup, kdy v jednom řádku můžeme uložit hodnoty do více proměnných:

#!/bin/bash

read -p "Zadejte vaše tři oblíbené barvy: " BARVA1 BARVA2 BARVA3

echo "Vaše oblíbené barvy jsou: $BARVA1, $BARVA2 a $BARVA3"

Mezera při zadávání je signál pro Bash, že tady vstup končí a dále bude pokračovat vstup pro následující proměnnou. Pokud zadáme více vstupů, než je proměnných, všechny navíc se uloží do poslední proměnné:

#!/bin/bash

read -p "Zadejte vaše tři oblíbené barvy: " BARVA1 BARVA2 BARVA3
echo "Barva 1: $BARVA1"
echo "Barva 2: $BARVA2"
echo "Barva 3: $BARVA3"

Po spuštění skriptu zadáme barvy a vidíme výstup:

Konzolová aplikace
Zadejte vaše tři oblíbené barvy: zelená žlutá červená modrá hnědá
Barva 1: zelená
Barva 2: žlutá
Barva 3: červená modrá hnědá

Výchozí hodnota proměnné

Pokud budeme psát rozsáhlý a sofistikovaný skript, může nastat situace, kdy uživatel svůj vstup nezadá a jen stiskne enter. Tím celý program spadne, protože nebude vědět, co dělat dál. Pro tyto účely můžeme nastavit výchozí (default) hodnotu proměnné:

#!/bin/bash

read -p "Zadejte vaši přezdívku: " PREZDIVKA
PREZDIVKA="${PREZDIVKA:=anonym}"

V případě, že uživatel nezadá svojí přezdívku a jen stiskne enter, automaticky se nastaví hodnota proměnné PREZDIVKA na anonym.

Konstanta

Již víme, že proměnné se dají přepisovat. Můžeme tomu chtít zabránit, např. upravuje-li skript více lidí. Pokud nechceme, aby někdo omylem přepsal naší hodnotu, nastavíme jí jako konstantu. Jinými slovy ji nastavíme pouze ke čtení:

#!/bin/bash

readonly EMAIL="[email protected]"

Pokud se této konstantě dále v kódu pokusíme nastavit jinou hodnotu, Bash to bude ignorovat a ponechá jí tu původní. Tyto konstanty je dobré umístit pod sebe co nejvýše ve skriptu, např. hned pod shebang. Pokud budeme chtít jednu z konstant přepsat, rychle ji najdeme a celý kód to dělá přehlednější.

Poziční proměnné

Uživatelský vstup můžeme zadat při spouštění skriptu jako jeho parametr. Např. tímto způsobem:

itnetwort@itnetwork:~$ bash script.sh David Bash
Vaše jméno je David.
Váš skriptovací jazyk je Bash.

Slouží k tomu poziční proměnné, které zadáváme ve skriptu pomocí čísel $1 až $9. Bash bude postupně přiřazovat vstupy proměnným podle pořadí, v jakém jsme je zadali. Skript pro výše uvedený výstup by vypadal takto:

#!/bin/bash

echo "Vaše jméno je $1."
echo "Váš skriptovací jazyk je $2."

Poziční proměnná $0

Speciální funkci má proměnná $0, která vrací vždy název skriptu.

#!/bin/bash

echo "Vaše jméno je $1."
echo "Název vašeho skriptu je $0."

Po spuštění skriptu vidíme výstup:

Konzolová aplikace
Vaše jméno je David.
Název vašeho skriptu je script.sh.

Pokud tuto proměnnou použijeme mimo skript přímo v terminálu, vrátí nám náš výchozí shell:

itnetwort@itnetwork:~$ echo $0
/bin/bash

Výpis všech pozičních proměnných

Další speciální proměnná je $@, která vypíše hodnoty všech pozičních proměnných:

#!/bin/bash

echo "Jméno: $1"
echo "Skriptovací jazyk: $2"
echo "Dohromady: $@"

Po spuštění skriptu vidíme výstup:

Konzolová aplikace
Jméno: David
Skriptovací jazyk: Bash
Dohromady: David Bash

Matematické operace

Bash nám umožňuje provádět základní matematické operace. S použitím dodatečné knihovny pak budeme moci použít i operace pokročilé. Pro základní operace využíváme standardní znaménka tak, jak jsme zvyklí:

+ Sčítání
- Odečítání
* Násobení
/ Dělení
% Zbytek po dělení

Syntaxe zápisu pak vypadá takto:

#!/bin/bash

CISLO1=10
CISLO2=5

echo $((CISLO1 + CISLO2))
echo $((CISLO1 - CISLO2))
echo $((CISLO1 * CISLO2))
echo $((CISLO1 / CISLO2))
echo $((CISLO1 % CISLO2))

Po spuštění skriptu vidíme výstup:

Konzolová aplikace
15
5
50
2
0

Můžeme tedy využít uživatelského vstupu a vytvořit tak jednoduchou kalkulačku:

#!/bin/bash

echo "Součet: $(($CISLO1 + $CISLO2))"
echo "Rozdíl: $(($CISLO1 - $CISLO2))"
echo "Součin: $(($CISLO1 * $CISLO2))"
echo "Podíl: $(($CISLO1 / $CISLO2))"
echo "Zbytek po dělení: $(($CISLO1 % $CISLO2))"

Po spuštění skriptu a zadání čísel 10 a 5 vidíme výstup:

Konzolová aplikace
Součet: 15
Rozdíl: 5
Součin: 50
Podíl: 2
Zbytek po dělení: 0

Příkaz expr

Další variantou zápisu aritmetických operací je s použitím příkazu expr:

#!/bin/bash

# Sčítání
expr 10 + 5

# Odečítání
expr 10 - 5

# Násobení
expr 10 \* 5

# Dělení
expr 10 / 5

# Zbytek po dělení
expr 10 % 5

Při použití * to Bash vyhodnotí jako zástupný znak a vrátí tak syntaktickou chybu. Je proto potřeba tento znak escapovat zpětným lomítkem.

Stejný zápis s použitím proměnných pak vypadá takto:

#!/bin/bash

echo "Součet: $(expr $CISLO1 + $CISLO2)"
echo "Rozdíl: $(expr $CISLO1 - $CISLO2)"
echo "Součin: $(expr $CISLO1 \* $CISLO2)"
echo "Podíl: $(expr $CISLO1 / $CISLO2)"
echo "Zbytek po dělení: $(expr $CISLO1 % $CISLO2)"

Je důležité dodržet mezeru mezi číslem a operátorem. Bash to jinak vyhodnotí jako běžný text.

Prohloubili jsme si naše znalosti proměnných a umíme už použít uživatelský vstup a základní matematiku. Naše skripty už jsou výrazně zajímavější!

V příští lekci, Skriptování v Bashi - Matematické operace a datové typy, se podíváme na pokročilé aritmetické operace s využitím externího nástroje, počítání s desetinnými čísly a datové typy.


 

Předchozí článek
Skriptování v Bashi - Proměnné
Všechny články v sekci
Skriptování v Bashi
Přeskočit článek
(nedoporučujeme)
Skriptování v Bashi - Matematické operace a datové typy
Článek pro vás napsal Václav Franz
Avatar
Uživatelské hodnocení:
27 hlasů
Aktivity