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 …]
OPTSTRING
- L'elenco dei caratteri riconosciuti come argomenti. Esempio:-h
,-v
.OPTNAME
- L'argomento analizzato da[email protected]
sarà memorizzato nelOPTNAME
variabile. Puoi usare qualsiasi nome come optname.OPTARG
- Se sono stati passati argomenti aggiuntivi, questo viene archiviato inOPTARG
variabile.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