Как сделать разбор аргументов в bash
Синтаксис: getopts optstring varname [arg ...]
optstring = строка со списком аргументов, varname - имя переменной, куда будеи записываться опция, arg - список аргументов (по умолчанию это $@).
Формат строки - список символов (запрещены ‘:’ и ‘?’), если после символа идёт ‘:’, то после опции должен быть аргумент.
Если строка начинается с ‘:’, то bash не будет писать об ошибках разбора сам (см. в примере скрипта).
OPTIND = индекс аргумента, в начале работы скрипта это 1, при каждом успешном вызове - инкрементируется. Можно выставить в другое значение. Он не сбрасывается автоматически!
OPTARG = аргумент опции, если таковой есть (например -n 1 -> OPTARG=1).
Если getopts встречает неверную опцию, он ставит varname в ‘?’, а в OPTARG - значение опции.
Если опция верная, но отсутствует аргумент, то varname будет выставлена в ‘:’, а в OPTARG - также значение опции.
Пример (стащен отсюда https://www.golinuxcloud.com/bash-getopts/ и модифицирован):
#!/bin/bash
function usage {
echo "Usage: $(basename $0) [-h] [-n NUM]"
}
# list of arguments expected in the input
optstring=":hn:"
while getopts ${optstring} arg; do
case ${arg} in
h)
echo "showing usage!"
usage
;;
n)
echo "-n arg is ${OPTARG}"
;;
:)
echo "$0: Must supply an argument to -$OPTARG." >&2
exit 1
;;
?)
echo "Invalid option: -${OPTARG}."
exit 2
;;
esac
done
echo $OPTIND