Команда Bash getopts - PullRequest
       19

Команда Bash getopts

3 голосов
/ 27 марта 2012

Я следую примеру IBM с их сайта:

(объявление № 5) http://www.ibm.com/developerworks/library/l-bash-parameters/index.html

#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
  do
    case "$optname" in
      "p")
        echo "Option $optname is specified"
        ;;
      "q")
        echo "Option $optname has value $OPTARG"
        ;;
      "?")
        echo "Unknown option $OPTARG"
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        ;;
      *)
      # Should not occur
        echo "Unknown error while processing options"
        ;;
    esac
    echo "OPTIND is now $OPTIND"
  done

Все, что я хочу, это иметь опцию, имя которой больше 1 буквы. т.е. -pppp и -qqqq вместо -p и -q.

Я написал свою программу, и реализация -help вызывает у меня проблему ...

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Для обычных команд оболочки -help эквивалентно -h -e -l -p, поэтому, если вы проанализируете "-help" с getopts, он будет обрабатываться как четыре отдельных аргумента.Из-за этого у вас не может быть префиксов из нескольких букв с префиксом только одного дефиса, если вы не хотите выполнять весь анализ самостоятельно.По соглашению, опциям, которые не являются просто односимвольными символами (то есть «длинными опциями»), предшествуют две черточки, чтобы сделать вещи однозначными.

Соглашение для текста справки заключается в поддержке как -h, так и * 1007.*.

К сожалению, встроенная в bash getopts не поддерживает длинные опции, но во всех распространенных дистрибутивах Linux есть отдельная утилита getopt, которую можно использовать вместо нее, которая поддерживает длинные опции.

В этом ответе обсуждается тема

4 голосов
/ 27 марта 2012

Upfloor's правы. утилита getopt поддерживает длинные опции, пока вы можете использовать --option. Может быть, вы можете попробовать это.

#!/bin/bash
args=`getopt -l help :pq: $*`
for i in $args; do
    case $i in
    -p) echo "-p"
        ;;
    -q) shift;
        optarg=$1;
        echo "-q $optarg"
        ;;
    --help)
        echo "--help"
        ;;
    esac
done
...