У меня есть функция bash, с которой я пытаюсь использовать getopts, и у меня проблемы.Разбор getopts в bash
Функция предназначена называться сама по себе (getch
), с дополнительным -s
флагом (getch -s
), или с помощью дополнительного аргумента строки после нее (так getch master
и getch -s master
оба действительны).
Сниппет ниже, где моя проблема лежит - это не целая функция, но это то, что я сосредоточен на:
getch()
{
if [ "$#" -gt 2 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [-s] [branch-name]" >&2
return 1
fi
while getopts "s" opt; do
echo $opt # This line is here to test how many times we go through the loop
case $opt in
s)
squash=true
shift
;;
*)
;;
esac
done
}
getch -s master
случай, когда странность происходит. Выше следует выплюнуть s
один раз, но вместо этого, я получаю это:
[[email protected]:git-repositories/temp]$ getch -s master
s
s
[[email protected]:git-repositories/temp]$
Почему разборе -s
неавтоматического дважды?
Я с трудом воспроизводя эту проблему. Я скопировал ваш код в файл и запустил его с помощью -s master, -s -s -s и любых других глупых вещей и не смог получить более 1 с для печати. –
Извините, я не могу воспроизвести его. Он отлично работает для меня. Измените «echo $ opt» на «echo». В getopts: $ opt «', чтобы сделать его отличным, если что-то еще повторяет его. –
Поместите 'OPTIND = 1' перед циклом getops. '$ OPTIND' - это позиция в списке параметров, которая должна быть проанализирована следующим методом getopts (Когда вы закончите цикл while, вы должны сделать' shift $ ((OPTIND-1)) 'to" shift away "те анализируемые параметры). Если вы откажетесь повторно установить OPTIND на 1, то в следующий раз, когда вы сделаете getopts в текущей оболочке (например: другая функция), вы будете синтаксический анализ начиная с $ OPTIND-го параметра, обычно пустого, делая getops return false, а «выходить сразу, без анализа параметров. –