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

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

  • Функция stateful bash
  • Заполнение вкладки Bash происходит не в подстановке команд
  • Как помещать вспомогательную оболочку и связанные с ней команды в фоновом режиме?
  • Каковы накладные расходы на использование подоболочек?
  • Как установить переменные среды для программы, выполненной с помощью `nohup`?
  • Невозможно grep список заданий, когда задания, вызванные функцией
  • фигурные скобки и подоболочка
  • 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

    Как установить пары фиксированного значения, вертикально ориентированные пары ключ-значение в файле CSV?

    Как использовать интернет-соединение?

    Проблемы с созданием Virtual_IP для PaceMaker + Corosync – CentOS 7

    Найти отличия в файле и сортировке файла по ключу

    Разница между sar -W и sar -B?

    Перемещение файлов точек с использованием bash и создание символических ссылок

    Преимущества использования именованных каналов и сокетов, а не временных файлов

    перезапустить X11 / Xwindows без отключения сеанса ssh

    Примеры (не рекомендации для) агента отправки сообщений (MSA)

    Переключить ключ к двум модификаторам или использовать мета-ярлыки в терминале (терминатор)

    Дата и время в Linux – ежемесячный «mongodump»

    Можно ли копировать данные с одного сеанса экрана на другое?

    Debian jessie для решения проблемы обновления – «systemd breaks udev»

    Вывод последней даты изменения в другой файл?

    требуемый результат не достигается с помощью сценария bash

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