Efektivní zpracování přepínačů Bashi
⏳ Doba čtení: ~3 min (392 slov)Odkaz na gist
Pro dobře čitelné scripty v bashi doporučuji stavový automat pro zpracování přepínačů. Tento přístup umožňuje snadno rozšířit skript o další přepínače a zároveň udržet kód přehledný a snadno udržovatelný.
Alternativně lze použít i getopts pro zpracování přepínačů, ale ten nepodporuje dlouhé přepínače (např. --help), což může být nevýhodou pro uživatele, kteří jsou zvyklí na tento styl.
Na začátku kódu jsou definovány konstatny a řídící proměnné.
#!/bin/bash
# By Pytel
#DEBUG=true
DEBUG=false
VERBOSE=false
Dále script obsahuje funkci printHelp, která vypíše nápovědu pro uživatele.
Jednoduchá detekce vyhodnotí zda je script spuštěný s přepínači nebo bez. Pokud není zadán žádný přepínač, script vypíše nápovědu a ukončí se s kódem.
While smyčka s case zpracovává jednotlivé přepínače. Každý přepínač je zpracován v samostatném bloku, což umožňuje snadno přidat další přepínače v budoucnu.
Příkaz shift posune všechny argumenty o jeden doleva, což umožňuje zpracovat další přepínač nebo argument v další iteraci smyčky. Tímto způsobem se stavový automat postupně přechroustá přes všechny zadané přepínače a provede konfiguraci skriptu podle zadaných parametrů.
Složitější příkazy lze zpracovat pomocí funkcí, kterým se předávají parametry. To umožňuje modularizovat kód a zlepšit jeho čitelnost.
# Konstanta, kterou chceme konfigurovat pomocí prepinace
TIME=5
# Funkce pro nastaveni casu a osetreni vstupu
function setTime() { # ( time)
TIME="$1"
}
# hlavni cast progamu
sleep $TIME
Potom v kódu:
-t | --time) shift; setTime "$1" || exit 4;;
Pokud příjde přepínač -t nebo --time, v bloku case zavoláme funci setTime, přesuneme se o jeden argument do prava a předáme ho do funkce.
Dvě || spojují dvě operace: první je volání funkce setTime s argumentem, a druhá je kontrola, zda tato operace byla úspěšná. Pokud setTime vrátí chybu (například pokud není zadán žádný argument), skript se ukončí s kódem 4.
Po zkončení zpracování přepínačů se script může věnovat své hlavní funkci, přičemž všechny potřebné proměnné a nastavení jsou již nakonfigurovány podle zadaných přepínačů.