getopts усекает значение аргумента - PullRequest
1 голос
/ 16 февраля 2012

Мне нужно передать строковое значение, содержащее интервал, как параметр в myscript.sh Код выглядит так:

while getopts "m:i:t:" OPTION
do
 case $OPTION in
     m)
         M=$OPTARG
         echo M: $M
         ;;
     i)
         I=$OPTARG
         echo I: $I
         ;;
     t)
         T=$OPTARG
         echo T: $T
         ;;
     ?)
         usage
         exit
         ;;
 esac
done

Это прекрасно работает, когда я вызываю его прямо из командной строки:

./myscript.sh -m 1 -i '0 1 2 3' -t '2142'
M: 1
I: 0 1 2 3
T: 2142

Однако мне нужно передать -i как строковую переменную, и я не могу заставить ее работать. Строка для опции -i усекается, а опция -t даже не появляется (возможно, новая строка).

I='0 1 2 3'
./myscript.sh -m 1 -i "'"$I"'" -t '2142'
M: 1
I: '0

I='0 1 2 3'
II="'"$(echo $I)"'"
./myscript.sh -m 1 -i $II -t '2142'
M: 1
I: '0

Есть предложения? Спасибо!

1 Ответ

3 голосов
/ 16 февраля 2012

Почему вы так цитируете, когда пытаетесь запустить его?Я уверен, что именно это вы и хотели сделать:

./myscript.sh -m 1 -i "$I" -t 2142

Двойные кавычки обрабатывают все символы внутри них как буквальные, за исключением нескольких вещей, включая $, что позволяет расширять переменные.Одинарные кавычки также останавливают расширение переменной.Каждый из них защищает другой тип цитаты, так что "'" это просто ' символ, а '"' это просто " символ.

Это означает, что "'"$I"'" превращается в '0 1 2 3', без особого значения для одинарных кавычек и без защиты пробелов - вы также можете написать его как \'0 1 2 3\'.Пробелы, будучи незащищенными, разделяют слова, поэтому первое слово - \'0.Поэтому ваш сценарий видит это как значение для параметра, а 1, 2 и 3' как дополнительные аргументы.Вы можете видеть это, если после цикла while вы добавляете shift $((OPTIND - 1)) для удаления проанализированных опций, а затем echo "arguments: $@" после анализа ваших опций.Вы также увидите, что, поскольку getops ожидает, что все параметры находятся спереди, это заставило вас упустить опцию -t, рассматривая ее как аргумент.

...