Předávání argumentů programu je jednou z běžných operací v jakémkoli jazyce, který používáte. Podobně se v tomto článku podíváme na to, jak analyzovat argumenty ve skriptech bash pomocí vestavěné funkce getopts bash v Linuxu.
Úvod
Každý příkaz, který spustíme v terminálu, má přiřazený argument. Můžete například použít nejzákladnější příkaz v Linuxu s názvem df který zobrazuje využití místa na disku souborového systému. Přijímá argumenty/příznaky jako -h
, -i
, --version
, atd.
Podobně jako v tomto případě, když vytváříte skripty shellu v závislosti na případu použití, možná budete muset zpracovat skript na základě předaného argumentu.
Existují dva způsoby, jak analyzovat argumenty předané skriptu v bash.
Jedním z nich je psaní logiky pro ruční analýzu argumentů pomocí speciálních proměnných [email protected], $1, $2 … $N. Dalším způsobem by bylo použít getopts .
Getopts je vestavěná funkce bash kompatibilní s POSIXem, která přijímá krátké argumenty jako -h
, -v
, -b
, atd. Nemůžete předat dlouhé argumenty jako --help
, --version
. Pokud chcete analyzovat dlouhé možnosti, existuje další nástroj nazvaný getopt což je externí program a není vestavěný bash.
Při práci s příznaky/argumenty mě napadají tři možné scénáře.
- Skript, který se spustí, i když není předán žádný argument nebo příznaky.
- Skript, který přijímá příznaky, ale bez argumentů.
- Skript, který přijímá příznaky a související argumenty pro příznak.
V následujících částech se dozvíte, jak vytvořit bash skript splňující výše uvedené scénáře.
Získání nápovědy
Pro přístup k části nápovědy getopts můžete spustit následující příkaz help.
$ getopts -help
Základní konstrukce Getoptů
Existují čtyři důležité pojmy, o kterých byste měli vědět, abyste mohli pracovat s getopts.
getopts: getopts optstring name [arg …]
OPTSTRING
- Seznam znaků, které jsou rozpoznány jako argumenty. Příklad:-h
,-v
.OPTNAME
- Analyzovaný argument z[email protected]
budou uloženy vOPTNAME
variabilní. Jako optname můžete použít libovolné jméno.OPTARG
- Jsou-li předány další argumenty, pak jsou uloženy vOPTARG
proměnná.OPTIND
- Index ukazující na další argument ke zpracování.
Když předáte argumenty skriptu, budou uloženy v proměnné [email protected] Getopts získá seznam argumentů z [email protected] použijte OPTIND
a analyzovat to.
Měli byste zadat seznam rozpoznaných argumentů v OPTSTRING
. Smyčka while se používá k iteraci přes seznam předávaných argumentů a pomocí OPTIND
, getopts získá argument a uloží jej do OPTNAME
.
Prohlášení o případu se používá ke kontrole, zda se vzor shoduje s OPTNAME
a spusťte jeho odpovídající příkaz.
Níže uvedený kód spustím v celém článku. Toto je jednoduchý kód k pochopení. Nejprve jsem vytvořil funkci s názvem „help " kde je syntaxe použití pro můj skript.
V OPTSTRING používám tři argumenty; "-s
." , -T
, -h
". Proměnná s názvem ARG
." je OPTNAME
použitý v níže uvedeném kódu. Analyzovaný argument bude uložen v $ARG
a pomocí příkazu case se pokusí zjistit, zda se vzor shoduje s argumentem v ARG
proměnná.
Následující skript bude přijímat příznaky jako -s
, -h
, -T
a můžete také kombinovat příznaky jako -shT
.
#!/bin/bash function help(){ echo "USAGE: args.sh -s, -T <arg>, -h" } while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing" ;; \?) echo "Something is wrong" ;; esac done shift "$((OPTIND-1))"
Funkčnost výše uvedeného kódu bude podrobně vysvětlena v následující sekci.
Neprošel žádný argument
Výchozí chování getopts je, že pokud není předán žádný argument, nevyvolá chybovou zprávu a skončí s návratovým kódem nula .
V některých případech by se skript neměl spustit, když není předán žádný argument. V takovém případě můžete pomocí podmíněných příkazů zkontrolovat délku předávaných argumentů ([email protected]
) je nula nebo ne. Pokud nebudou předány žádné argumenty, skript selže.
Podívejte se na níže uvedený kód. Předané argumenty ukládám do proměnné PASSED_ARGS
a zkontrolovat jeho délku. Pokud je délka PASSED_ARGS
není nula, pak while loop
s getopts poběží, jinak help
funkce se spustí a skript se ukončí s návratovým kódem 1 .
[email protected] if [[ ${#PASSED_ARGS} -ne 0 ]] then while getopts ":sT:h" ARG; do case "$ARG" in s) echo "Running -s flag" ;; T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;; h) help ;; :) echo "argument missing for $ARG" ;; \?) echo "Something is wrong" ;; esac done else help exit 1 fi shift "$((OPTIND-1))"
K vyhodnocení předaných argumentů můžete také použít následující jednořádkový řádek.
[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }
Argumenty s příznaky a jejich podporované argumenty
Můžete buď pouze předat příznaky jako -h
nebo -s
na skript nebo příznaky a související argument jako -T
k tomu. Měli byste přidat dvojtečku (: ) za identifikátorem příznaku (-T
), aby příznak přijal argument.
V níže uvedeném kódu můžete vidět, že jsem přidal dvojtečku (:
) za identifikátorem T
. To znamená, že když předám -T
příznak do skriptu, měl bych s ním předat další argument.
while getopts ":sT:h" ARG; do
Když je argument předán příznaku, bude uložen do proměnné $OPTARG
. Musíte napsat logiku, která zachytí proměnnou a podle toho ji zpracuje. Zkopírujte a spusťte stejný kód z předchozí části.
T) echo "Running -T flag" echo "Argument passed is $OPTARG" ;;
Můžete také kombinovat a spouštět více argumentů najednou.
Zpracování chyb
Mohou nastat situace, kdy jsou argumenty předány nesprávně a skript by měl vyvolat nějaké chyby.
Ve výchozím nastavení getopts zobrazí chybovou zprávu, když předaný příznak není v OPTSTRING
nebo pokud se vám nepodaří předat příznaku další argumenty. Přidání dvojtečky na začátek OPTSTRING
potlačí výchozí chybové zprávy.
Odstraňme dvojtečku a spusťte skript znovu. Předávám -x
jako první argument, který není přítomen v OPTSTRING
. Za druhé, -T
vyžaduje další argument, který jsem nedokázal poskytnout. V obou případech mi to vyhodí chybu.
Nyní můžete potlačit výchozí chybové zprávy a vytisknout si vlastní chybové zprávy. Podívejte se na níže uvedené vzory z prohlášení o případu.
- Dvojtečka (:) -> Pokud není předán žádný další argument
OPTARG
bude nastaveno na dvojtečku a můžete psát logiku pro tisk chybových zpráv. - \? -> Když argument, který není v
OPTSTRING
je předán,OPTNAME
bude nastaveno na "?
".
:) echo "argument missing" ;; \?) echo "Something is wrong" ;;
Použití Shift a OPTIND
Pokud vezmete nějaké existující skripty napsané pomocí getopts, uvidíte tento příkaz po while
smyčka.
shift "$((OPTIND-1))"
Když je skript spuštěn, OPTIND
je nastaveno na 1 . OPTIND
ukazuje na pozici dalšího argumentu, který má být zpracován getopts.
Výše uvedený příkaz odstraní všechny možnosti analyzované pomocí getopts a $1
nebude nastaven na první nepovinný argument předaný skriptu.
Závěr
V tomto článku jsme viděli, jak analyzovat argumenty v bash skriptech pomocí funkce getopts. Getopts podporuje pouze krátkou formu argumentů a nemůžete předat dlouhé argumenty.
Zpočátku se může zdát obtížné pracovat s getopty. Ale pokud pochopíte základní koncept, pak to bude snadné.
Podobné čtení:
- Jak analyzovat soubory CSV ve skriptech Bash v systému Linux
Příručky skriptování Bash:
- Jak vytvořit dialogová okna GUI ve skriptech Bash pomocí Zenity v Linuxu a Unixu
- Bash Scripting – Case Statement
- Skriptování Bash – podmíněné příkazy
- Bash Scripting – manipulace s řetězci
- Skriptování Bash – příkaz Printf s příklady
- Skriptování Bash – indexované pole s příklady
- Bash Scripting – Asociativní pole vysvětleno s příklady
- Bash Scripting – pro smyčku vysvětlenou s příklady
- Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady
- Přesměrování Bash vysvětleno na příkladech
- Bash Scripting – proměnné vysvětlené na příkladech
- Bash Scripting – funkce vysvětlené na příkladech
- Příkaz Bash Echo vysvětlený s příklady v Linuxu
- Výukový program Bash Heredoc pro začátečníky