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

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

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 

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

  • Как изменить переменные
  • Сценарий Bash для заполнения шаблона
  • Использование find с двумя наборами переменных
  • Установка переменной, значение которой зависит от другой переменной
  • dirname и basename против расширения параметров
  • Как выбрать количество цифр в переменной в моих сценариях?
  • Передать переменную с помощью EOF и использовать переменную хоста
  • Расширение «$ @» для пользовательских переменных
  • bash - добавить пустую строку в heredoc через переменную
  • Как использовать глобальные переменные массивы в псевдонимах или функциях
  • Удалить определенное слово в переменной
  • Linux и Unix - лучшая ОС в мире.