Или то, что кажется безудержным излишеством, но на самом деле упрощенно ... Практически охватывает все ваши случаи, и никаких пустых строк или унарных проблем.
В случае, если первым аргументом является '-v', тогда сделайте свое условное ps -ef, иначе во всех остальных случаях бросьте использование.
#!/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
Если вас не волнует, где находится аргумент '-v', просто отбросьте регистр внутри цикла. Это позволит пройти все аргументы и найти '-v' где угодно (при условии, что он существует). Это означает, что порядок аргументов командной строки не важен. Предупреждаем, что переменная arg_match установлена, поэтому это просто флаг. Это позволяет несколько вхождений аргумента '-v'. Все остальные вхождения '-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
Но разрешить несколько вхождений аргумента удобно использовать в таких ситуациях, как:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Мы не заботимся о порядке аргументов и даже допускаем несколько аргументов -u. Да, просто разрешить:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]";$-показывает активные флаги опций оболочки, а не имя текущего скрипта.