Код: Выделить всё
#!/bin/bash
while getopts ":m:d:" OPTN; do
case $OPTN in
m)
if [ "$OPTARG" == "-d" ]; then
((OPTIND=$OPTIND - 1))
else
MAIN_DIC=$OPTARG
fi
USE_MAIN=1
;;
d)
if [ "$OPTARG" == "-m" ]; then
((OPTIND=$OPTIND - 1))
else
ADV_DIC=$OPTARG
fi
USE_ADV=1
;;
":")
case $OPTARG in
m)
USE_MAIN=1
;;
d)
USE_ADV=1
;;
esac
;;
"?")
echo "$OPTARG - unknown option!"
echo
exit 1
;;
*)
echo "Unknown error while processing options!"
exit 1
;;
esac
done
shift $(($OPTIND - 1))
Смотрим, что за аргумент у первого ключа. Если этот аргумент совпадает со вторым ключем, то мы делаем вывод, что первый ключ пустой - уменьшаем OPTIND на единицу, чтобы getopts обработал наш вторй ключ. Если аргумент у первого ключа не совпадает со вторым ключем, значит нам дали путь к файлу для первого ключа. Если у второго ключа нет аргументов, то мы обрабатываем это в ветке ":"). Естественно, первым ключем может быть как -m, так и -d, любой из этих ключей может иметь дополнительный аргумент или не иметь. Например:
Код: Выделить всё
./script -m -d
./script -d -m file1
./scripts -d file2 -m
./script -m file 1 -d file 2
Данный код работает в точности как и было описано, в bash 3 версии. Но в bash версии 2.03 имеются некоторые траблы. Как я смог установить, переменная OPTIND уменьшается на единицу, но такое ощущение, что bash ее новое значение игнорирует. Соответственно, если мы получили ключи вида ./script -m -d, то ключ -d не обрабатывается getopts, ведь он прошел как аргумент для первого ключа!
Есть ли какое-нибудь решение данной проблемы? Может быть это малоизвестный баг bash-2.03??