GNU/Linux >> Znalost Linux >  >> Linux

Bash Scripting – Analýza argumentů v Bash skriptech pomocí getopts

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 …]
  1. OPTSTRING - Seznam znaků, které jsou rozpoznány jako argumenty. Příklad:-h , -v .
  2. OPTNAME - Analyzovaný argument z [email protected] budou uloženy v OPTNAME variabilní. Jako optname můžete použít libovolné jméno.
  3. OPTARG - Jsou-li předány další argumenty, pak jsou uloženy v OPTARG proměnná.
  4. 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

Linux
  1. Použití Bash pro automatizaci

  2. Zpracování chyb ve skriptech Bash

  3. Přidání argumentů a voleb do vašich Bash skriptů

  1. Bash skriptování (I)

  2. Poskytnout dva argumenty k jedné možnosti pomocí Getopts?

  3. Použití Linux Sleep Command ve skriptech Bash

  1. Použití příkazu Linux Basename ve skriptech Bash

  2. automatizace relace telnet pomocí bash skriptů

  3. Jak analyzovat hlavičky HTTP pomocí Bash?