Команда Bash getopts

Я следую примеру 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 вызывает у меня проблему...


person spatara    schedule 26.03.2012    source источник
comment
Это своего рода дубликат. В любом случае, если вы хотите написать параметры в стиле Java, вам, вероятно, придется реализовать это самостоятельно или использовать какие-то другие инструменты, потому что стандартом для более длинных параметров является двойное тире...   -  person tchap    schedule 27.03.2012


Ответы (2)


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

По соглашению текст справки должен поддерживать как -h, так и --help.

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

Более подробно обсуждается тема в этом ответе

person je4d    schedule 26.03.2012

Верхний этаж прав. утилита 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
person Umae    schedule 27.03.2012