Почему вы используете ${@:$OPTIND}
, а не просто $@
или $*
?
Синтаксис ${parameter:index}
говорит использовать index
для разбора $parameter
. Если вы используете $@
, он будет использовать index
в качестве индекса параметров.
$ set one two three four #Sets "$@"
$ echo $@
one two three four
$ echo ${@:0}
one two three four
$ echo ${@:1}
one two three four
$ echo ${@:2}
two three four
$OPTIND
действительно используется только если вы используете getopts
. Это количество раз getopts
обрабатывает параметры в $@
. Согласно справочной странице bash :
OPTIND устанавливается в 1 каждый раз, когда вызывается оболочка или сценарий оболочки.
Что может объяснить, почему вы постоянно получаете значение 1
.
отредактировано в ответ на отредактированный вопрос
@ David - "./b $ @" по-прежнему печатает аргументы, переданные в (см. Q edit). Я хочу передать только параметры, а не аргументы
Итак, если я выполнил:
$ a -a foo -b bar -c fubar barfu barbar
Вы хотите перейти на b:
$ b -a foo -b bar -c fubar
но не
$ b -arg1 foo -arg2 bar -arg3 fubar barfu barbar
Это будет сложно ...
Есть ли причина, по которой вы не можете передать всю строку на b
и просто игнорировать ее?
Я полагаю, что можно использовать регулярные выражения:
$ echo "-a bar -b foo -c barfoo foobar" | sed 's/\(-[a-z] [^- ][^- ]*\) *\([^-][^-]*\)$/\1/'
-a bar -b foo -c barfoo
Я не могу ручаться, что это регулярное выражение будет работать во всех ситуациях (т. Е. Что, если нет параметров?). По сути, я привязываю его к концу строки, а затем сопоставляю для последнего параметра и аргумента и остальной части строки. Я делаю замену только с последним параметром и аргументом.
Я тестировал его в нескольких ситуациях, но вам может быть лучше использовать getopts
для захвата аргументов и последующей передачи их b
самостоятельно, либо просто b
игнорировать эти дополнительные аргументы, если это возможно .