Как использовать getopt с этими несколькими значениями?

Я пытаюсь создать сценарий с несколькими вариантами. Я начал с документа, получил несколько ошибок, зашел в браузер. Прочитайте несколько ссылок и найдите это на SO: Использование getopts в сценарии оболочки bash для получения длинных и коротких параметров командной строки.

Поэтому я прочитал его и переписал свой сценарий. Я где-то ошибся. Где я ошибаюсь?

Ш

#!/bin/sh

TEMP=`getopt -o vfts: --long verbose,format,type,style: \
             -n 'opt2' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$TEMP"

VERBOSE=false
FORMAT=
TYPE=
STYLE=
while true; do
    case "$1" in
        -v | --verbose ) VERBOSE=true; shift ;;
        -f | --format ) FORMAT="$2"; shift 2 ;;
        -t | --type ) TYPE="$2"; shift 2 ;;
        -s | --style ) STYLE="$2"; shift 2 ;;
        -- ) shift; break ;;
        -*) break ;;
        * ) break ;;
    esac
done

echo "verbose = $VERBOSE"
echo "format = $FORMAT"
echo "type = $TYPE"
echo "style = $STYLE"

Вывод

> ./opt2.sh -v -f fofo -t toto -s soso

verbose = true // ok
format = -t // should be fofo
type =  // should be toto
style = soso // ok

person aloisdg    schedule 17.03.2014    source источник
comment
запустите свой скрипт sh -x ./opt2.sh .....   -  person KevinDTimm    schedule 17.03.2014
comment
нет, если я использую chmod +x на opt2.sh.   -  person aloisdg    schedule 17.03.2014
comment
@aloisdg -x, о котором говорил Кевин, не означает выполнение, он устанавливает параметр оболочки xtrace, который приводит к выводу каждого оператора, выполняемого сценарием оболочки, на консоль. Таким образом, вы можете увидеть, где ваш сценарий идет не так.   -  person wich    schedule 17.03.2014


Ответы (2)


Ваша строка параметров неверна, она должна быть vf:t:s:. Двоеточие указывает на обязательный аргумент, который есть у каждой из ваших опций, кроме v. Также необходимо соответствующим образом настроить длинную строку параметров.

person wich    schedule 17.03.2014
comment
verbose,format:type:style: Наверное? Я попробую сейчас. - person aloisdg; 17.03.2014
comment
Я думаю, что вам не хватает нескольких запятых - person wich; 17.03.2014
comment
Где я пропускаю несколько запятых? Он отлично работает так. Должен ли я добавить недостающие запятые? - person aloisdg; 17.03.2014
comment
@aloisdg, что означало verbose,format:,type:,style:, что более читабельно/удобно в обслуживании, хотя кажется, что запятая после двоеточия не требуется. - person glenn jackman; 17.03.2014
comment
@aloisdg вы тестировали длинные параметры со сценарием без запятых? - person wich; 17.03.2014

Вы могли бы сделать некоторую отладку самостоятельно, довольно легко:

$ set -- -v -f fofo -t toto -s soso
$ TEMP=$(getopt -o vfts: --long verbose,format,type,style: -- "$@")
$ echo "$TEMP"
 -v -f -t -s 'soso' -- 'fofo' 'toto'

Хм, ваши аргументы -f и -t не связаны. Сделайте их обязательными

$ TEMP=$(getopt -o vf:t:s: --long verbose,format:,type:,style: -- "$@")
$ echo "$TEMP"
 -v -f 'fofo' -t 'toto' -s 'soso' --

Чтобы продемонстрировать, что запятые, по-видимому, не являются строго обязательными в определении --long:

$ TEMP=$(getopt -o vf:t:s: --long verbose,format:type:style: -- "$@")
$ echo $?; echo "$TEMP"
0
 -v -f 'fofo' -t 'toto' -s 'soso' --
person glenn jackman    schedule 17.03.2014
comment
Не думал об этом, но да! - person aloisdg; 17.03.2014