Або для того, що здається нестримним надмірним, але насправді спрощеним ... Майже охоплює всі ваші справи, і немає порожніх рядків чи одинарних проблем.
У випадку, якщо першим аргументом є '-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;; #It is good practice to throw a code, hence allowing $? check
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;; # this is set, but could increment.
*) ;;
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]";$-показує активні параметри оболонки, а не ім'я поточного сценарію.