GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Scripting – Analizza gli argomenti negli script Bash usando getopts

Il passaggio di argomenti a un programma è una delle operazioni comuni in qualsiasi lingua utilizzata. Allo stesso modo, in questo articolo vedremo come analizzare gli argomenti negli script bash usando la funzione incorporata getopts bash in Linux.

Introduzione

Ogni comando che eseguiamo nel terminale ha un argomento ad esso associato. Ad esempio, puoi prendere il comando più semplice in Linux chiamato df che mostra l'utilizzo dello spazio su disco del file system. Accetta argomenti/flag come -h , -i , --version , ecc.

In modo simile, quando crei script di shell a seconda del caso d'uso, potresti dover elaborare lo script in base all'argomento passato.

Esistono due modi per analizzare gli argomenti passati allo script in bash.

Uno sta scrivendo la logica per analizzare manualmente gli argomenti usando le variabili speciali [email protected], $1, $2 … $N. Un altro modo sarebbe utilizzare getopts .

Getopts è una funzione integrata bash compatibile con POSIX che accetta argomenti brevi come -h , -v , -b , ecc. Non puoi passare argomenti lunghi come --help , --version . Se vuoi analizzare le opzioni lunghe c'è un'altra utility chiamata getopt che è un programma esterno e non incorporato in bash.

Ci sono tre possibili scenari che mi vengono in mente quando lavoro con flag/argomenti.

  • Lo script che viene eseguito anche quando non vengono passati argomenti o flag.
  • Lo script che accetta i flag ma senza argomenti.
  • Lo script che accetta i flag e gli argomenti associati per il flag.

Imparerai come creare uno script bash che soddisfi gli scenari di cui sopra nelle prossime sezioni.

Ricevere aiuto

Puoi eseguire il seguente comando di aiuto per accedere alla sezione di aiuto di getopts.

$ getopts -help

Costrutto principale di Getopts

Ci sono quattro termini importanti che dovresti conoscere per poter lavorare con getopts.

getopts: getopts optstring name [arg …]
  1. OPTSTRING - L'elenco dei caratteri riconosciuti come argomenti. Esempio:-h , -v .
  2. OPTNAME - L'argomento analizzato da [email protected] sarà memorizzato nel OPTNAME variabile. Puoi usare qualsiasi nome come optname.
  3. OPTARG - Se sono stati passati argomenti aggiuntivi, questo viene archiviato in OPTARG variabile.
  4. OPTIND - Indice che punta al prossimo argomento da elaborare.

Quando passi gli argomenti allo script, questi verranno archiviati nella variabile [email protected] Getopts riceverà l'elenco degli argomenti da [email protected] use OPTIND e analizzalo.

Devi specificare l'elenco degli argomenti riconosciuti in OPTSTRING . While loop viene utilizzato per scorrere l'elenco degli argomenti passati e utilizzare OPTIND , getopts otterrà l'argomento e lo memorizzerà in OPTNAME .

La denuncia del caso viene utilizzato per verificare se il modello corrisponde a OPTNAME ed esegui la sua istruzione corrispondente.

Eseguirò il codice seguente per tutto l'articolo. Questo è un codice semplice da capire. Per prima cosa ho creato una funzione denominata "aiuto " dove è presente una sintassi di utilizzo per il mio script.

Sto usando tre argomenti in OPTSTRING; "-s , -T , -h ". Variabile denominata ARG è il OPTNAME utilizzato nel codice seguente. L'argomento analizzato verrà archiviato in $ARG e usando l'istruzione case cercherà di trovare se il modello corrisponde all'argomento in ARG variabile.

Il seguente script accetterà flag come -s , -h , -T e puoi anche combinare flag come -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))"

Le funzionalità del codice sopra saranno spiegate in dettaglio nella prossima sezione.

Nessun argomento superato

Il comportamento predefinito di getopts è se non viene passato alcun argomento, non genererà un messaggio di errore e uscirà con il codice di ritorno zero .

In alcuni casi, lo script non dovrebbe essere eseguito quando non viene passato alcun argomento. In tal caso, puoi utilizzare le istruzioni condizionali per controllare la lunghezza degli argomenti passati ([email protected] ) è zero o no. Se non vengono passati argomenti, lo script avrà esito negativo.

Dai un'occhiata al codice qui sotto. Sto memorizzando gli argomenti passati nella variabile PASSED_ARGS e controllarne la lunghezza. Se la lunghezza di PASSED_ARGS non è zero, quindi while loop con getopts verrà eseguito, altrimenti help la funzione verrà eseguita e lo script uscirà con il codice di ritorno 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))"

Puoi anche utilizzare la riga seguente per valutare gli argomenti passati.

[[ ${#PASSED_ARGS} -ne 0 ]] && echo "Arguments stored in \[email protected] = [email protected]" || { echo "No argument passed"; help; exit 1; }

Argomenti con flag e argomenti supportati

Puoi semplicemente passare flag come -h o -s allo script o ai flag e all'argomento associato come -T ad esso. Dovresti aggiungere un due punti (: ) dopo l'identificatore del flag (-T ) per fare in modo che la bandiera accetti l'argomento.

Nel codice seguente, puoi vedere che ho aggiunto i due punti (: ) dopo l'identificatore T . Significa quando passo il -T flag allo script, dovrei passare un argomento aggiuntivo con esso.

while getopts ":sT:h" ARG; do

Quando un argomento viene passato al flag verrà memorizzato nella variabile $OPTARG . Devi scrivere la logica per catturare la variabile ed elaborarla di conseguenza. Copia ed esegui lo stesso codice della sezione precedente.

T) echo "Running -T flag"
   echo "Argument passed is $OPTARG" ;;

Puoi anche combinare ed eseguire più argomenti alla volta.

Errori di gestione

Potrebbero esserci situazioni in cui gli argomenti vengono passati in modo errato e lo script dovrebbe generare alcuni errori.

Per impostazione predefinita, getopts genererà un messaggio di errore quando un flag passato non è in OPTSTRING o se non riesci a passare argomenti aggiuntivi al flag. Aggiunta di due punti all'inizio di OPTSTRING eliminerà i messaggi di errore predefiniti.

Rimuoviamo i due punti ed eseguiamo di nuovo lo script. Sto passando -x come primo argomento che non è presente in OPTSTRING . In secondo luogo, -T richiede un argomento aggiuntivo che non sono riuscito a fornire In entrambi i casi mi genera l'errore.

Ora puoi eliminare i messaggi di errore predefiniti e stampare i tuoi messaggi di errore. Dai un'occhiata ai modelli seguenti dalla dichiarazione del caso.

  • Colonna (:) -> Se non viene passato alcun argomento aggiuntivo OPTARG sarà impostato su due punti e potrai scrivere la logica per stampare i messaggi di errore.
  • \? -> Quando un argomento che non è in OPTSTRING è passato, OPTNAME sarà impostato su "? ".
:​) echo "argument missing" ;;
\?) echo "Something is wrong" ;;

Utilizzo di Shift e OPTIND

Se prendi degli script esistenti scritti usando getopts vedrai questa dichiarazione dopo while ciclo.

shift "$((OPTIND-1))"

Quando lo script viene attivato, OPTIND è impostato su 1 . Il OPTIND punta alla posizione dell'argomento successivo che deve essere elaborato da getopts.

L'istruzione precedente rimuoverà tutte le opzioni analizzate da getopts e $1 non verrà impostato sul primo argomento non facoltativo passato allo script.

Conclusione

In questo articolo, abbiamo visto come analizzare gli argomenti negli script bash usando la funzione getopts. Getopts supporta solo una forma breve di argomenti e non puoi passare argomenti lunghi.

All'inizio, potrebbe sembrare complicato lavorare con getopts. Ma se capisci il concetto di base, diventa facile.

Lettura simile:

  • Come analizzare i file CSV negli script Bash in Linux

Guide agli script di Bash:

  • Come creare finestre di dialogo della GUI negli script Bash con Zenity in Linux e Unix
  • Scripting Bash – Case Statement
  • Scripting Bash – Dichiarazioni condizionali
  • Scripting Bash – Manipolazione di stringhe
  • Scripting Bash – Spiegazione del comando Printf con esempi
  • Scripting Bash:array indicizzato spiegato con esempi
  • Scripting Bash:array associativo spiegato con esempi
  • Scripting di Bash:il ciclo For viene spiegato con esempi
  • Scripting Bash:spiegazione del ciclo While e Until con esempi
  • Il reindirizzamento di Bash spiegato con esempi
  • Scripting Bash:variabili spiegate con esempi
  • Scripting Bash:funzioni spiegate con esempi
  • Comando Bash Echo spiegato con esempi in Linux
  • Tutorial Bash Heredoc per principianti

Linux
  1. Utilizzo di Bash per l'automazione

  2. Gestione degli errori negli script Bash

  3. Aggiunta di argomenti e opzioni ai tuoi script Bash

  4. Script Bash(I)

  5. Utilizzo del comando di sospensione di Linux negli script Bash

Script di shell per principianti - Come scrivere script Bash in Linux

Script Bash(II)

Utilizzo del comando Linux Dirname negli script Bash

Bash Beginner Series #5:Utilizzo di operatori aritmetici negli script Bash

Bash Beginner Series #3:Passare argomenti agli script Bash

Creazione di classi e oggetti utilizzando lo scripting bash