Передать строку как аргументы с пробелами в BASH - PullRequest
1 голос
/ 08 октября 2019

У меня есть программа CLI, которая генерирует аргументы в виде одной строки для другой программы CLI. Я звоню как из BASH. Вот упрощенная версия того, что у меня есть:

produce_args() {
    echo "arg1 \"ar g2\" arg3"
}

consume_args() {
    for arg in "$@"; do
        echo "$arg"
    done
}

TMP="$(produce_args)"
consume_args $TMP

Он печатает:

arg1
"ar
g2"
arg3

Итак, аргумент 2 был разделен на два аргумента. Как увидеть вывод, подобный этому?

arg1
ar g2
arg3

Я могу изменить свою программу CLI генератора и скрипт BASH, но не программу потребителя. Также я могу использовать zsh, но я не думаю, что это имеет значение в моем случае.

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Я бы воздерживался от использования eval как можно чаще, хотя я не против использовать его в случае необходимости. В вашем случае я бы, вероятно, использовал новую строку в качестве аргумента-разделителя, изменил бы IFS соответствующим образом и сделал бы TMP массивом:

#!/bin/bash
produce_args() {
        echo -e "arg1\nar g2\narg3"
}
consume_args() {
        for arg in "${@}"; do
                echo "$arg"
        done
}
NL="
"
OLDIFS="${IFS}"
IFS="${NL}"
declare -a TMP
TMP=($(produce_args))
IFS="${OLDIFS}"
consume_args "${TMP[@]}"
0 голосов
/ 08 октября 2019

Вы можете использовать 'eval' при вызове потребление_args. Это позволит оболочке обрабатывать строку в кавычках из аргументов произведения в виде одного аргумента:

#! /bin/bash

produce_args() {
    echo "arg1 \"ar g2\" arg3"
}

consume_args() {
    for arg in "$@"; do
        echo "$arg"
    done
}

TMP="$(produce_args)"
eval consume_args $TMP
...