Risposte:
ecco un esempio per bash:
usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything
where:
-h show this help text
-s set the seed value (default: 42)"
seed=42
while getopts ':hs:' option; do
case "$option" in
h) echo "$usage"
exit
;;
s) seed=$OPTARG
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
Per usarlo all'interno di una funzione:
"$FUNCNAME"
invece di$(basename "$0")
local OPTIND OPTARG
prima di chiamaregetopts
basename
trattino iniziale.
"$FUNCNAME"
non usare "$0"
. Inoltre, aggiungilocal OPTIND OPTARG
FUNCNAME
lavori. Ho tutte le mie funzioni all'interno di un singolo file, quindi questo è perfetto per estenderle in qualcosa di utile per gli altri.
"$usage"
ogni luogo in cui lo usi.
shift $((OPTIND - 1))
?
Il primo argomento di uno script di shell è disponibile come variabile $1
, quindi l'implementazione più semplice sarebbe
if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` [somestuff]"
exit 0
fi
Ma cosa ha detto anubhava.
[
è la versione conforme a POSIX.
function
: è necessario sostituirlo exit 0
con return
se non si desidera terminare la shell dopo aver eseguito la funzione. (L'ho già fatto prima 😂)
ecco una parte che lo uso per avviare un server VNC
#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}
stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}
#########################
# The command line help #
#########################
display_help() {
echo "Usage: $0 [option...] {start|stop|restart}" >&2
echo
echo " -r, --resolution run with the given resolution WxH"
echo " -d, --display Set on which display to host on "
echo
# echo some stuff here for the -a or --add-options
exit 1
}
################################
# Check if parameters options #
# are given on the commandline #
################################
while :
do
case "$1" in
-r | --resolution)
if [ $# -ne 0 ]; then
resolution="$2" # You may want to check validity of $2
fi
shift 2
;;
-h | --help)
display_help # Call your function
exit 0
;;
-d | --display)
display="$2"
shift 2
;;
-a | --add-options)
# do something here call function
# and write it in your help function display_help()
shift 2
;;
--) # End of all options
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
## or call function display_help
exit 1
;;
*) # No more options
break
;;
esac
done
######################
# Check if parameter #
# is set too execute #
######################
case "$1" in
start)
start # calling function start()
;;
stop)
stop # calling function stop()
;;
restart)
stop # calling function stop()
start # calling function start()
;;
*)
# echo "Usage: $0 {start|stop|restart}" >&2
display_help
exit 1
;;
esac
È un po 'strano che ho inserito il riavvio e il riavvio in un caso separato, ma dovrebbe funzionare
if
Se hai una sola opzione da controllare e sarà sempre la prima opzione ( $1
), la soluzione più semplice è una if
con un test ( [
). Per esempio:
if [ "$1" == "-h" ] ; then
echo "Usage: `basename $0` [-h]"
exit 0
fi
Si noti che per la compatibilità posix =
funzionerà anche ==
.
$1
?Il motivo $1
per cui è necessario racchiuderlo tra virgolette è che se non esiste, $1
la shell tenterà di funzionare if [ == "-h" ]
e fallire perché ==
è stato dato un solo argomento quando se ne aspettava due:
$ [ == "-h" ]
bash: [: ==: unary operator expected
getopt
ogetopts
Come suggerito da altri , se hai più di una singola opzione o hai bisogno della tua opzione per accettare un argomento, allora dovresti assolutamente optare per la complessità aggiuntiva dell'uso getopts
.
Come riferimento rapido, mi piace il tutorial su 60 secondi getopts . †
Potresti anche considerare il getopt
programma invece della shell integrata getopts
. Consente l'uso di opzioni lunghe e opzioni dopo argomenti non di opzione (ad es. foo a b c --verbose
Anziché solo foo -v a b c
). Questa risposta StackOverflow spiega come usare GNU getopt
.
† jeffbyrnes ha affermato che il collegamento originale è morto, ma per fortuna il modo in cui la macchina era stata archiviata.
Meglio usare la funzione getopt di bash. Per ulteriori informazioni, consultare queste domande e risposte : Utilizzo di getopts nello script della shell bash per ottenere opzioni di riga di comando lunghe e brevi
penso che puoi usare case per questo ...
case $1 in
-h) echo $usage ;;
h) echo $usage ;;
help) echo $usage ;;
esac