2012-03-26 4 views
3

Я следую примеру IBM, с их сайта:Bash getopts команды

(листинг # 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.

Я написал свою программу и реализации -помощь дает мне проблема ...

+0

Это своего рода [дубликат] (http://stackoverflow.com/a/402410/1230632). В любом случае, если вы хотите написать варианты стиля Java, вам, вероятно, придется реализовать его самостоятельно или использовать некоторые другие инструменты, потому что стандартом для более длинных опций является double-dash ... – tchap

+1

Возможный дубликат [Использование getopts в сценарии оболочки bash для получить длинные и короткие параметры командной строки] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options) – l0b0

ответ

8

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

Конвенция для текста справки должна поддерживать как -h, так и --help.

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

There's more discussion of the topic in this answer

4

Upfloor являются правы. Утилита 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