Тема: Программируем в ракушку SHELL. Часть 2 : getopts

Ответить в теме
Показано с 1 по 15 из 15
  1. Вверх #1
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42

    По умолчанию Программируем в ракушку SHELL. Часть 2 : getopts

    Экспериментирую с getopts.
    :~$ man bash
    getopts is used by shell procedures to parse positional parameters...

    Тестовый скрипт got (getoptstest):
    Код:
    ALPHA=default
    BETTA=default
    GAMMA=default
    SOMETEXT=default
    
    OPTERR=0
    
    usage()
    {
      echo "Usage: `basename $0` [-a] [-b betta-data] [-c gamma-data] sometext"
      exit 1
    }
    
    if [ $# = 0 ]; then
      usage
    fi
    
    while getopts ab:c: OPTION
    do
      case $OPTION in
      a) ALPHA="a parametr on"
        ;;
      b) BETTA=$OPTARG
        ;;
      c) GAMMA=$OPTARG
        ;;
      ?) usage
        ;;
      esac
    done
    
    shift `expr $OPTIND - 1`
    
    if [ $# != 1 ]
      then
        usage
      else
        SOMETEXT="$@"
    fi
    
    echo "alpha = " $ALPHA
    echo "betta = " $BETTA
    echo "gamma = " $GAMMA
    echo "sometext = " $SOMETEXT
    ТЗ: скрипт принимает параметры:
    -a : просто переключатель, необязательный
    -b, -c : опции с указанием значений, необязательные
    sometext : просто текст (одно слово), обязательный.
    :~$ got -b betta -a test
    alpha = a parametr on
    betta = betta
    gamma = default
    sometext = test

    :~$ got -b betta test -a
    Usage: got [-a] [-b betta-data] [-c gamma-data] sometext

    Т.е. если указать sometext до одного из ключей - ошибка. Как можно обойти это "правило" - ключи, обрабатываемые getopts, можно ставить в разном порядке, а sometext - только в конце
    здесь завуалированный мат


  2. Вверх #2
    mancurt, я бы сделал внешний цикл, внутри которого уже идет цикл с getopts.
    Если после цикла с getopts остается не менее одного параметра, значит первый из них это SOMETEXT,
    а оставшиеся (если есть) еще раз на getopts.
    Не опохмелившись - не приступай к работе!

  3. Вверх #3
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42
    Цитата Сообщение от banzai
    mancurt, я бы сделал внешний цикл, внутри которого уже идет цикл с getopts.
    Если после цикла с getopts остается не менее одного параметра, значит первый из них это SOMETEXT, а оставшиеся (если есть) еще раз на getopts.
    Не понял, сорри.
    Что циклить во внешнем цикле? параметры?
    здесь завуалированный мат

  4. Вверх #4
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42
    Кроме getopts циклом тогда уж лучше использовать shift. Но именно этого я и хотел бы избежать. С shift работы больше.

    Есть еще getopt. В man getopt указано
    Example scripts are provided with the getopt(1) distribution, and are optionally installed in /usr/local/lib/getopt or /usr/lib/getopt .
    Чего у меня нет 8(
    здесь завуалированный мат

  5. Вверх #5
    Тигровна Аватар для Tigra
    Пол
    Женский
    Адрес
    /dev/null
    Сообщений
    1,528
    Репутация
    267
    лови)
    Вложения
    Не будите во мне Зверя, он и так не высыпается

  6. Вверх #6
    mancurt, ладно, без цикла.
    После shift `expr $OPTIND - 1` вставляешь :
    SOMETEXT=$1
    OPTIND=2
    и еще раз свой цикл с getopts
    Должно помочь.

  7. Вверх #7
    "Tigra, что это было, море?"
    Не опохмелившись - не приступай к работе!

  8. Вверх #8
    Тигровна Аватар для Tigra
    Пол
    Женский
    Адрес
    /dev/null
    Сообщений
    1,528
    Репутация
    267
    banzai, песочек
    это был ПРИМЕР а вообще фиговый это был пример))
    так как ты говоришь, на мой взгляд, не пройдет, потому что в случае когда текст идет перед аргументами - это одна строка. $OPTIND должен быть равен 1 в таком случае.
    строку просто парсить надо, можно и без getopts обойтись, если постараться)
    Не будите во мне Зверя, он и так не высыпается

  9. Вверх #9
    Tigra, а ты попробуй.
    $sh got text -a -b betta -c gamma
    alpha = a parametr on
    betta = betta
    gamma = gamma
    sometext = text
    $
    Не опохмелившись - не приступай к работе!

  10. Вверх #10
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42
    Цитата Сообщение от banzai
    mancurt, ладно, без цикла.
    После shift `expr $OPTIND - 1` вставляешь :
    SOMETEXT=$1
    OPTIND=2
    и еще раз свой цикл с getopts
    Должно помочь. ;)
    Это ж не красиво... но все равно, спасибо.

    а если еще почекать не состоит ли SOMETEXT из нескольких слов...
    здесь завуалированный мат

  11. Вверх #11
    mancurt, тебе и карт... тьфу! ... клаву в руки
    Не опохмелившись - не приступай к работе!

  12. Вверх #12
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42
    Цитата Сообщение от Tigra
    строку просто парсить надо, можно и без getopts обойтись, если постараться)
    тогда можно просто shift и проверять каждый параметр на совпадение с ...
    здесь завуалированный мат

  13. Вверх #13
    mancurt, я так понял, что использование getopts было начальным условием.
    Цитата Сообщение от mancurt
    а если еще почекать не состоит ли SOMETEXT из нескольких слов...
    тогда, наверное, имеет смысл писать свой getopts, т.е. "идти по следу Tigra". :-D
    Не опохмелившись - не приступай к работе!

  14. Вверх #14
    Постоялец форума
    Пол
    Мужской
    Сообщений
    1,480
    Репутация
    42
    К этому все движется... Думал "зачем изобретать колесо"...
    здесь завуалированный мат

  15. Вверх #15
    BTW, mancurt, а что мешает просто взять
    в кавычки sometext (в случае, если он составной)?
    Не опохмелившись - не приступай к работе!


Ответить в теме

Похожие темы

  1. Shell построит самое большое судно на Земле
    от LindaFromOslo в разделе Основной форум
    Ответов: 1
    Последнее сообщение: 14.10.2009, 17:21
  2. Shell жжет!
    от pproffessor в разделе Авто и мото
    Ответов: 8
    Последнее сообщение: 22.09.2009, 14:49
  3. Программируем в ракушку SHELL
    от mancurt в разделе Программирование
    Ответов: 7
    Последнее сообщение: 12.01.2005, 10:07
  4. Anime :: Ghost in shell 2
    от iFog в разделе Кино и видео
    Ответов: 2
    Последнее сообщение: 02.11.2004, 06:48

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения