Lub z powodu czegoś, co wydaje się szalejącą przesadą, ale w rzeczywistości jest uproszczone ... Prawie obejmuje wszystkie twoje przypadki, bez pustych ciągów lub jednoargumentowych problemów.
W przypadku, gdy pierwszym argumentem jest „-v”, wykonaj warunek ps -ef
, w przeciwnym razie we wszystkich innych przypadkach wyrzuć użycie.
#!/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;;
esac
Jeśli nie obchodzi nas, gdzie jest argument „-v”, po prostu umieść wielkość liter w pętli. Pozwoliłoby przejść przez wszystkie argumenty i znaleźć „-v” w dowolnym miejscu (o ile istnieje). Oznacza to, że kolejność argumentów w wierszu poleceń nie jest ważna. Ostrzegam, jak przedstawiono, zmienna arg_match jest ustawiona, więc jest to tylko flaga. Pozwala na wielokrotne wystąpienie argumentu „-v”. Można łatwo zignorować wszystkie inne wystąpienia „-v”.
#!/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;;
*) ;;
esac
done
if [ ! $arg_match ]
then
usage
fi
Jednak zezwalanie na wiele wystąpień argumentu jest wygodne w użyciu w takich sytuacjach, jak:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Nie dbamy o kolejność argumentów, a nawet zezwalamy na wiele argumentów -u. Tak, łatwo jest również zezwolić na:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]"
;$-
pokazuje flagi opcji aktywnej powłoki, a nie nazwę bieżącego skryptu.