2010-05-21 8 views
2

У меня есть функция 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 неавтоматического дважды?

+0

Я с трудом воспроизводя эту проблему. Я скопировал ваш код в файл и запустил его с помощью -s master, -s -s -s и любых других глупых вещей и не смог получить более 1 с для печати. –

+0

Извините, я не могу воспроизвести его. Он отлично работает для меня. Измените «echo $ opt» на «echo». В getopts: $ opt «', чтобы сделать его отличным, если что-то еще повторяет его. –

+1

Поместите 'OPTIND = 1' перед циклом getops. '$ OPTIND' - это позиция в списке параметров, которая должна быть проанализирована следующим методом getopts (Когда вы закончите цикл while, вы должны сделать' shift $ ((OPTIND-1)) 'to" shift away "те анализируемые параметры). Если вы откажетесь повторно установить OPTIND на 1, то в следующий раз, когда вы сделаете getopts в текущей оболочке (например: другая функция), вы будете синтаксический анализ начиная с $ OPTIND-го параметра, обычно пустого, делая getops return false, а «выходить сразу, без анализа параметров. –

ответ

2

Я также не могу воспроизвести проблему: на ящике Ubuntu 10.4, работающем с Bash 4, или на моем MacOSX, в котором работает Bash 3.2.17.

Окружающая среда оболочки может быть испорчена более ранними усилиями по отладке.

Вы пытались начать с нового окна терминала? Или запустите новую оболочку с помощью «exec bash» и повторите попытку.

[email protected]:~ $ 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 
> } 
[email protected]:~ $ getch -s master 
s 
+0

Я попробовал сделать новую подоболочку, как вы и предположили, и это сработало. Должно быть, я сделал что-то в своей среде заранее ... Во всяком случае, спасибо за помощь! – ABach

+0

Это время от времени. Легко застрять в отладке скрипта и забыть, что ваша среда может стать коррумпированной. –

+0

(удалять комментарии, которые я неправильно поставил в этом ответе, а не в сообщении афера) –

0

Попробуйте разобрать параметры вне функции, которую вы написали. Я поиграл с этим немного больше сегодня днем. У меня было трудное время, когда он работал правильно, анализируя параметры в функции, а не только в основной части скрипта.

В противном случае я не знаю, что вам сказать.

Смежные вопросы