Oder für etwas, das wie zügelloser Overkill aussieht, aber eigentlich simpel ist ... Deckt so ziemlich alle Ihre Fälle ab und keine leeren Zeichenfolgen oder unären Bedenken.
In dem Fall, in dem das erste Argument '-v' ist, machen Sie Ihre Bedingung ps -ef, andernfalls werfen Sie in allen anderen Fällen die Verwendung.
#!/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
Wenn es Sie nicht interessiert, wo sich das Argument '-v' befindet, lassen Sie den Fall einfach in einer Schleife fallen. Das würde es erlauben, alle Argumente zu durchlaufen und '-v' überall zu finden (vorausgesetzt, es existiert). Dies bedeutet, dass die Reihenfolge der Befehlszeilenargumente nicht wichtig ist. Seien Sie gewarnt, wie dargestellt, die Variable arg_match wird gesetzt, es handelt sich also lediglich um ein Flag. Es ermöglicht das mehrfache Auftreten des Arguments '-v'. Man könnte alle anderen Vorkommen von '-v' leicht genug ignorieren.
#!/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
Das Zulassen mehrerer Vorkommen eines Arguments ist jedoch in folgenden Situationen praktisch:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Wir kümmern uns nicht um die Reihenfolge der Argumente und erlauben sogar mehrere -u-Argumente. Ja, es ist ganz einfach, auch Folgendes zuzulassen:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]";$-Zeigt die aktiven Shell-Optionsflags an, nicht den Namen des aktuellen Skripts.