Удерживать несколько пробелов, содержащих аргументы в одной переменной?

Я пытался отладить мой сценарий оболочки:

content_type='-H "Content-Type: application/json"' curl $content_type -d "{"test": "test"}" example.com 

Я узнал, что это не делает то, что я ожидаю. В этом скрипте аргументы, передаваемые curl (из-за $content_type ), следующие:

  1. -H
  2. "Content-Type:
  3. application/json"

вместо (что я ожидал):

  1. -H
  2. Content-Type: application/json

Я знаю, что могу написать сценарий следующим образом:

 content_type="Content-Type: application/json" curl -H "$content_type" -d "{"test": "test"}" example.com 

и он будет работать таким образом, но мне интересно, можно ли содержать несколько пробелов, содержащих аргументы в одной переменной.

Во второй (рабочей) версии, если я хочу исключить тип содержимого, мне нужно удалить две вещи: -H и $content_type .

Тем не менее, я хочу знать, можно ли поставить параметр и его значение в единый объект, так что исключение / включение типа содержимого приведет к удалению / добавлению единого объекта.

Использование массивов не переносится, поскольку в POSIX нет массивов.

Почему первый метод ведет себя так?

Причина – расщепление слов . Когда мы определяем content_type следующим образом:

 content_type='-H "Content-Type: application/json"' 

он имеет значение:

 -H "Content-Type: application/json" 

Когда мы ссылаемся на эту переменную с кавычками (то есть $content_type , а не "$content_type" ), расширенное значение становится предметом разделения слов. Из раздела разбиения слова руководства bash:

Оболочка сканирует результаты разложения параметров, подстановки команд и арифметического расширения, которые не встречались в двойных кавычках для разбиения слов.

На той же странице:

Оболочка рассматривает каждый символ $IFS как разделитель и разбивает результаты других расширений на слова, используя эти символы в качестве терминаторов полей. Если IFS не установлен, или его значение равно <space><tab><newline> , значение по умолчанию …

Итак, -H "Content-Type: application/json" разделяется с помощью <space><tab><newline> качестве разделителей. Это дает нам:

 -H "Content-Type: application/json" 

One Solution collect form web for “Удерживать несколько пробелов, содержащих аргументы в одной переменной?”

В стандартной оболочке есть один стандартный массив, такой как структура. Это позиционные параметры. Поэтому возможным решением является использование set -- … и "$@" . В вашем случае вы будете делать:

 set -- -H "Content-Type: application/json" curl "$@" -d "{"test": "test"}" example.com 

Обратите внимание, что это ограничивает доступ к одному доступному массиву. У вас не может быть одного для завивки, а другой для другой программы, например. И, конечно, это приводит к искажениям аргументов вашего сценария.

  • Переменная в команде find задана новой переменной в bash
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Bash: Объем переменных в цикле for с использованием тройника
  • Попытка присвоения не переменной?
  • шаблон awk с переменной в скрипте bash
  • имя сценария скрипта echo text name для циклизации нескольких текстов
  • Переменные баша в команде
  • как получить или отразить имя вызываемой функции bash?
  • перечислить файлы и сохранить их в переменных
  • Разделить команду и аргументы и вставить в переменную в сценарий bash
  • Как я могу объединить переменную оболочки с другими другими параметрами в моих командных строках?
  • Linux и Unix - лучшая ОС в мире.