O por lo que parece una exageración desenfrenada, pero en realidad es simplista ... prácticamente cubre todos sus casos, y no hay cadenas vacías o preocupaciones unarias.
En el caso de que el primer argumento sea '-v', haga su condicional ps -ef
, de lo contrario, en todos los demás casos, arroje el 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
Si a uno no le importa dónde está el argumento '-v', simplemente coloque el caso dentro de un bucle. El permitiría recorrer todos los argumentos y encontrar '-v' en cualquier lugar (siempre que exista). Esto significa que el orden de los argumentos de la línea de comandos no es importante. Tenga en cuenta que, como se presenta, la variable arg_match está configurada, por lo que es simplemente una bandera. Permite múltiples apariciones del argumento '-v'. Uno podría ignorar todas las demás apariciones de '-v' con bastante facilidad.
#!/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
Pero, permitir múltiples apariciones de un argumento es conveniente de usar en situaciones como:
$ adduser -u:sam -s -f -u:bob -trace -verbose
No nos importa el orden de los argumentos, e incluso permitimos múltiples argumentos -u. Sí, es muy sencillo permitir también:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]"
;$-
muestra las banderas de opciones de shell activas, no el nombre del script actual.