У меня есть функция bash, с которой я пытаюсь использовать getopts, и у меня возникают проблемы.
Функция предназначена для вызова сама по себе (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
один раз, но вместо этого я получаю следующее:
[user@host:git-repositories/temp]$ getch -s master
s
s
[user@host:git-repositories/temp]$
Почему он дважды анализирует параметр -s
?
echo $opt
наecho "In getopts: $opt"
, чтобы он отличался на случай, если что-то еще повторит его. - person Dennis Williamson   schedule 22.05.2010OPTIND=1
перед циклом getops.$OPTIND
- это позиция в списке параметров, которая должна быть проанализирована getopts следующей (когда вы закончите цикл while, вы должны сделатьshift $((OPTIND-1))
, чтобы сместить эти проанализированные параметры). Если вы не установите OPTIND в 1, в следующий раз, когда вы будете выполнять getopts в текущей оболочке (например, в другой функции), вы будете анализировать, начиная с параметра $OPTIND-th, обычно пустого, заставляя getops возвращать false, а в то время как выходит сразу, без разбора параметров. - person Olivier Dulac   schedule 03.12.2012shift
внутри цикла getops. Вместо этого послеdone
поместитеshift $((OPTIND -1))
, чтобы сместить все параметры, проанализированные getopts. - person Olivier Dulac   schedule 03.12.2012