Intereting Posts
возможно ли заблокировать пользователя в дереве каталогов данных в bash? Использование xrandr при запуске нового xserver Каталоги пользователей XDG Мой рукописный C + + Makefile дает команду не найдена RHEL Установка сообщения об ошибках при установке luks crypted filesystem при загрузке Аппаратное шифрование Samsung 850 Evo SSD Настроить верхнюю панель / глобальное меню / Super-Wingpanel в элементарной операционной системе Luna Как выйти из экрана входа в систему и запустить командную строку во время экрана входа в систему Могу ли я скрыть тот факт, что мой USB-шлюз запущен? ZFS: отправка / получение со скользящими моментальными снимками Путь интерфейса интерфейса туннеля Linux Двойная путаница монитора в Ubuntu Gnome 17.10 Установка Linux на SD-карту Почему прикосновение может меняться только все время, или ничего, если не владелец Кто начал xterm в моей системе киевских xterm + lightdm?

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

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

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" 

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

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

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