come analizzare correttamente flag e argomenti dello script di shell utilizzando getopts

Sto usando questo:

ad esempio ./imgSorter.sh -d directory -f format

il contenuto” degli script è:

#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

casi duso:

$ ./imgSorter.sh -d myDir -d was triggered with myDir OK

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f NOK: come mai una stringa che inizia con – non viene rilevata come flag?

Risposta

Hai detto a getopts che -d dovrebbe prendere un argomento e nella riga di comando si usa -d -f myformat che chiaramente (?) dice “-f è il argomento che “sto dando allopzione -d“.

Questo non è un errore nel codice, ma nelluso dello script sulla riga di comando.

Il tuo codice deve verificare che gli argomenti delle opzioni siano corretti e che tutte le opzioni siano impostate in modo appropriato.

Forse qualcosa di simile

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

Se lopzione -d è facoltativa e se desideri utilizzare un valore predefinito per la variabile dir nel codice sopra, dovresti iniziare impostando dir su quel valore predefinito prima di while loop.

Unopzione della riga di comando non può accettare e non accettare un argomento.

Commenti

  • ok grazie @Kusalananda, ho erroneamente pensato che getopts prendesse ogni – per linizio di una bandiera.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *