Сложность анализа односимвольных параметров заключается в том, что они могут быть объединены (например, -ab
эквивалентно -a -b
). У длинных опций в стиле GNU есть трудность, связанная с тем, что аргументы можно объединить или нет. С опциями, состоящими из нескольких символов с одним тире, нет никаких сложностей при синтаксическом анализе, поэтому вы можете легко сделать это вручную.
Большинство программ с параметрами, состоящими из одного тире и нескольких символов, принимают аргументы в виде отдельного аргумента командной строки.
foo=
bar=default
require_argument () {
if [ $# -eq 2 ]; then
echo >&2 "$0: Option $1 requires an argument"
exit 2
fi
eval "$1=\"\$3\""
}
while case "$1" in
--) shift; false;;
-foo) foo=1
-bar) require_argument bar "$@"; shift;;
-?*) echo >&2 "$0: Unknown option $1"; exit 2;;
*) false;;
esac
do
shift
done
Рассмотрите возможность использования длинных опций в стиле GNU. У них более стандартизованное поведение, и с ними знакомо больше людей.