O per quello che sembra eccessivo dilagante, ma in realtà è semplicistico ... Praticamente copre tutti i tuoi casi, e nessuna stringa vuota o preoccupazioni unarie.
Nel caso in cui il primo argomento sia '-v', fai il tuo condizionale ps -ef, altrimenti in tutti gli altri casi lancia l'uso.
#!/bin/sh
case $1 in
'-v') if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi;;
*) echo "usage: $0 [-v]"
exit 1;; #It is good practice to throw a code, hence allowing $? check
esac
Se non ci interessa dove si trova l'argomento "-v", rilascia semplicemente il caso all'interno di un ciclo. Permetterebbe di camminare su tutti gli argomenti e di trovare '-v' ovunque (ammesso che esista). Ciò significa che l'ordine degli argomenti della riga di comando non è importante. Tieni presente che, come presentato, la variabile arg_match è impostata, quindi è semplicemente una bandiera. Consente più occorrenze dell'argomento "-v". Si potrebbero ignorare tutte le altre occorrenze di '-v' abbastanza facilmente.
#!/bin/sh
usage ()
{
echo "usage: $0 [-v]"
exit 1
}
unset arg_match
for arg in $*
do
case $arg in
'-v') if [ "$arg" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
arg_match=1;; # this is set, but could increment.
*) ;;
esac
done
if [ ! $arg_match ]
then
usage
fi
Tuttavia, consentire più occorrenze di un argomento è conveniente da usare in situazioni come:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Non ci interessa l'ordine degli argomenti e ammettiamo anche più argomenti -u. Sì, è semplice consentire anche:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]";$-mostra i flag delle opzioni della shell attiva, non il nome dello script corrente.