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.