Передать параметры как опцию в пользовательском скрипте getopts в bash

Я хотел бы передать параметры в качестве параметра. Например.:

mycommand -a 1 -t '-q -w 111'

Скрипт не может распознать строку в кавычках. То есть он получает только часть строки.

getopts работает так же - видит только -q.

Для пользовательских getopts я использую аналогичный скрипт (пример):

while :
do
    case $1 in
        -h | --help | -\?)
            # Show some help
            ;;
        -p | --project)
            PROJECT="$2"
            shift 2
            ;;
        -*)
            printf >&2 'WARN: Unknown option (ignored): %s\n' "$1"
            shift
            ;;
        *)  # no more options. Stop while loop
            break
            ;;
        --) # End of all options
        echo "End of all options"
            shift
            break
            ;;
    esac
done

person Kirby    schedule 19.06.2015    source источник
comment
Как вы ожидаете, что сценарий будет использовать '-q -w 111'? Так же, как если бы это не цитировалось?   -  person chepner    schedule 19.06.2015
comment
Я использую вызов другого скрипта. anotherscript $customOptions   -  person Kirby    schedule 19.06.2015
comment
В секции разбора getopts нет -t...?   -  person anishsane    schedule 19.06.2015
comment
@chepner, вы могли бы просто использовать set - $@ в начале   -  person 123    schedule 19.06.2015
comment
Вы действительно никогда не хотите использовать $@ без кавычек; вы теряете информацию о том, какие аргументы могли содержать пробелы.   -  person chepner    schedule 19.06.2015
comment
@anishsane, да, потому что есть пример.   -  person Kirby    schedule 19.06.2015
comment
@chepner В этом был смысл, не так ли?   -  person 123    schedule 21.06.2015
comment
@ User112638726 Нет, вы теряете все пробелы. Например, "$@" сохраняет различие между -q "foo bar" и -q foo bar.   -  person chepner    schedule 26.06.2015
comment
@chepner Вы сказали, что The same as if it weren't quoted? я указал способ, при котором это было бы так же, как если бы оно не было в кавычках.   -  person 123    schedule 26.06.2015


Ответы (1)


Возможно, я неправильно понимаю вопрос, но getopts, похоже, работает для меня:

while getopts a:t: arg
do
    case $arg in
        a)  echo "option a, argument <$OPTARG>"
            ;;
        t)  echo "option t, argument <$OPTARG>"
            ;;
    esac
done

Бежать:

bash gash.sh -a 1 -t '-q -w 111'
option a, argument <1>
option t, argument <-q -w 111>

Разве это не то, чего ты хочешь? Может быть, вы пропустили : после опций с аргументами?

person cdarke    schedule 19.06.2015
comment
Хм, я проверил это подобным и не работало. Я проверю ваш пример. Спасибо! - person Kirby; 20.06.2015
comment
Ваш скрипт работает хорошо. Кажется, я где-то ошибся, и это не сработало для меня. Благодарность! - person Kirby; 20.06.2015