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 vOPTNAMEvariabilní. Jako optname můžete použít libovolné jméno.OPTARG- Jsou-li předány další argumenty, pak jsou uloženy vOPTARGpromě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
OPTARGbude nastaveno na dvojtečku a můžete psát logiku pro tisk chybových zpráv. - \? -> Když argument, který není v
OPTSTRINGje předán,OPTNAMEbude 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