Использование подоболочки для передачи параметров с пробелами

У меня есть оболочка с именем «name_value.sh», которую я хочу передать параметрам, сгенерированным в под-оболочке. Как я могу гарантировать, что команда, получающая параметры из резервных пространств подпрограммы?

ПРИМЕЧАНИЕ. Это очень упрощенный пример того, что я делаю. Пожалуйста, прочитайте полностью, прежде чем отвечать.

Упрощенный пример:

./name_value.sh $(echo "no_spaces"; echo "with spaces") 

Где name_value.sh выглядит так:

 #!/bin/bash echo "Name=$1" echo "Value=$2" 

Желаемый результат:

 Name=no_spaces Value=with spaces 

Это очень упрощенный пример. Моя настоящая суб-оболочка сложна, создает петли и выводит десятки пар имя / значение, которые все должны быть сгенерированы одновременно и переданы в имя_значение.sh одновременно. У меня также нет контроля над файлом оболочки, который я вызываю.

Я пробовал эхом с кавычками и использовал printf с «% q». Я также подумал о том, чтобы перенести результаты подоболочки в массив сначала, но не может заставить это работать. Мне нужна родительская оболочка для интерпретации подклассов, как если бы текст был введен вместо подклассов.

  • Как запускать команды надстройки по SSH?
  • echo результат из подоболочки в zsh
  • Как получить PID подоболочки в Korn Shell (эквивалент $ BASHPID)
  • Поведение stdin / stdout в сочетании с подоболочками и командой cd
  • Это ошибка в bash? `return` не выходит из функции, если вызывается из канала
  • zsh: подстановка команды не наследует stdin из родительского
  • Строка состояния Tmux мигает командой из # () перед отображением результата
  • cd в скрипте bash без псевдонима, функция, источник
  • 2 Solutions collect form web for “Использование подоболочки для передачи параметров с пробелами”

    Да. Установите переменную IFS (которая обычно содержит пробел, табуляцию, новую строку), чтобы быть только новой линией. Таким образом, пробелы и вкладки не будут использоваться для разделения слов. Это даст вам желаемый результат.

     IFS=$'\n' set -o noglob # disable the second effect of leaving that # $(...) unquoted. ./name_value.sh $(echo "no_spaces"; echo "with spaces") 

    Тем не менее, я бы сделал, чтобы скрипт читал из stdin.

     # name_value.sh IFS= read -r name IFS= read -r value echo "Name=$name" echo "Value=$value" 

    тогда

     ( echo no_spaces; echo with spaces ) | ./name_value.sh 

    Я думаю, что этот подход более надежный.

    Когда вы используете эту команду

     ./name_value.sh $(echo "no_spaces"; echo "with spaces") 

    Команда bash выполняет команды «sub-shells» в «$ ()» и возвращает строку вывода

    пример

    Команда ввода: ./name_value.sh $ (echo "no_spaces"; echo "с пробелами")

    Обработанная команда: ./name_value.sh no_spaces с пробелами

    Следующий шаг – выполнить скрипт bash с тремя аргументами

    Первый аргумент: no_space

    Второй аргумент: с

    Третий аргумент: пробелы


    Это то же самое, что вызов скрипта вручную с помощью команды

     ./name_value.sh no_spaces with spaces 

    Для решения проблемы вам нужно вставить цитаты вокруг вызова подкласса «$ ()»

    Ты нуждаешься в этом

     ./name_value.sh $(echo "no_spaces") "$(echo "with spaces")" 

    И вы обработали команду

     ./name_value.sh no_spaces "with spaces" 

    И, наконец, вы выведете это будет

     Name=no_spaces Value=with spaces 
    Interesting Posts

    Требует ли CentOS 5.9 Grub для работы на аппаратном RAID?

    Что такое .emacs? Как отредактировать его?

    Возможно ли, чтобы сценарий предварительной установки пакета Debian выполнял команды apt-get?

    Башрик для виртуального терминала

    совместимость / etc / shadow и / etc / passwd

    Список изменений файлов в определенной папке с огромным содержимым и несколькими уровнями подпапок (с достойной производительностью)

    цикл в файле с определенным расширением в сценарии оболочки дочерней папки

    заместитель char-to-char с sed

    Работа Sudo cron с использованием arp-scan дает пустой результат

    Решение «mv: Список аргументов слишком длинный»?

    Как исправить недостающие библиотеки?

    Как добавить другую запись ОС в Wubi grub

    приложение для просмотра архитектуры процессора в фигуре

    сервер хранения всех пользователей nfs на полных 666 правах доступа к файлам

    Не удается запустить команду в виде www-данных, используя su

    Linux и Unix - лучшая ОС в мире.