Почему вы так цитируете, когда пытаетесь запустить его?Я уверен, что именно это вы и хотели сделать:
./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
, рассматривая ее как аргумент.