Ou pelo que parece um exagero desenfreado, mas na verdade é simplista ... Quase cobre todos os seus casos, e nenhuma string vazia ou preocupações unárias.
No caso do primeiro argumento ser '-v', faça seu condicional ps -ef
, senão, em todos os outros casos, lance o 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 não se importa onde está o argumento '-v', simplesmente coloque o caso dentro de um loop. Isso permitiria percorrer todos os args e encontrar '-v' em qualquer lugar (desde que exista). Isso significa que a ordem dos argumentos da linha de comando não é importante. Esteja avisado, conforme apresentado, a variável arg_match está definida, portanto, é apenas um sinalizador. Ele permite várias ocorrências do argumento '-v'. Pode-se ignorar todas as outras ocorrências de '-v' 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
Porém, permitir várias ocorrências de um argumento é conveniente para uso em situações como:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Não nos importamos com a ordem dos argumentos e até permitimos vários argumentos -u. Sim, é simples permitir também:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]"
;$-
mostra os sinalizadores de opção do shell ativo, não o nome do script atual.