Разбор getopts в Баш - PullRequest
       24

Разбор getopts в Баш

2 голосов
/ 22 мая 2010

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

Ответы [ 3 ]

2 голосов
/ 22 мая 2010

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

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

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

stefanl@ubuntu:~ $ 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
> }
stefanl@ubuntu:~ $ getch -s master
s
1 голос
/ 22 мая 2010

Вот способ сделать это без getopts:

http://bsdpants.blogspot.com/2007/02/option-ize-your-shell-scripts.html

0 голосов
/ 22 мая 2010

Попробуйте разобрать параметры вне написанной вами функции. Этим днем ​​я немного поиграл с этим. Мне было трудно заставить его работать должным образом при разборе параметров в функции, а не только в основной части скрипта.

Иначе я не знаю, что тебе сказать.

...