Передача цитируемых значений аргумента Posix в bash - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть скрипт bash, где я пытаюсь передать аргументы в стиле posix с кавычками в другой скрипт, вызываемый внутри. В командной строке я мог бы набрать:

somescript --foo="bar baz"

Это означает, что для аргумента, имеющего ключ foo, значение равно bar baz. В некотором сценарии вы можете подумать, что это сработает:

innerscript "$@"

Однако это приводит к повторной кавычке полноты каждого аргумента, причем ключ и значение объединяются вместе, а не только в значение. Таким образом, innerscript получает "--foo=bar baz" и считает, что вы пытаетесь передать ключ с именем foo=bar baz с пустым значением .

Недостаточно сказать bash «перецитировать все переданные аргументы». Мне нужно сказать bash «перецитировать все переданные в аргументах точно так, как они были процитированы до ». Не меняйте положение моих цитат, братан!

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

Проблема в innerscript, тогда. Разницы между:

нет
innerscript --foo="bar baz"
innerscript "--foo=bar baz"
innerscript --foo=bar\ baz
innerscript --foo=bar' 'baz

или, несомненно, ряд других альтернатив. Внутри innerscript, $1 (в обозначениях оболочки) содержится всего 13 символов: --foo=bar baz. Кстати, то же самое относится к somescript; когда вы вызываете его, как показано, он не видит двойные кавычки. Они обрабатываются (и удаляются) оболочкой.

Чтобы увидеть это, попробуйте:

echo --foo="bar baz"
1 голос
/ 17 сентября 2011

Вы не можете этого сделать.

Скрипты получают аргументы. Когда оболочка анализирует эту строку, она передает первый аргумент как: "--foo = bar baz". Вы не можете ничего сделать, чтобы предотвратить это. Но я не понимаю, почему это вызывает какие-либо проблемы, вы можете разделить аргумент на основе =.

# function test { echo $1; }
# test a"b""c"'d'\e
abcde
0 голосов
/ 17 сентября 2011

Для разбора аргументов и опций используйте команду getopt.

Примечание 1: getopt (команда gnu) улучшено getopts (определено в POSIX).

Примечание 2: --long-options в стиле GNU, а не POSIX

...