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

У меня есть оболочка с именем «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». Я также подумал о том, чтобы перенести результаты подоболочки в массив сначала, но не может заставить это работать. Мне нужна родительская оболочка для интерпретации подклассов, как если бы текст был введен вместо подклассов.

  • Как помещать вспомогательную оболочку и связанные с ней команды в фоновом режиме?
  • Строка состояния Tmux мигает командой из # () перед отображением результата
  • Невозможно grep список заданий, когда задания, вызванные функцией
  • zsh: подстановка команды не наследует stdin из родительского
  • Функция stateful bash
  • Почему (echo ""; exit 1) не выходит из сценария?
  • Создание подошвы Bash с фигурными фигурными скобками
  • Как выполнить bash (в скрипте) с собственным файлом .bash_logout?
  • 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

    Команда «sudo rm \\» зависает – хотите, чтобы система не наносила ущерба системе

    Вызовите уведомление-отправить из правила udev

    Как получить systemd-udevd для создания мостового устройства при запуске?

    команда cp, которая частично разрешает символические ссылки

    Воспроизведение удаленного фильма на удаленном компьютере

    Почему не поддерживается соблюдение только параметра «Только для чтения» для монтирования привязок?

    отправить в журнал и отобразить на консоли

    Debian jessie. нуво, MMIO читал ошибку в … но. Любая работа вокруг?

    Почему vim не запрашивает пароль при повторном открытии зашифрованного файла?

    использовать SFTP в сценарии оболочки

    Вывод `iw list`: phy_x соответствует интерфейсу?

    Debian install unsuccessfull: установки DVD, dd, cat, Unetbootin, YUMI, Rufus, Live CD не работают

    Ошибка малины Pi RT.

    Запуск нескольких команд nohup в фоновом режиме

    Как играть в MIDI-файл в Linux Mint 18 Cinnamon (используя любой аудиоплеер)?

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