将字符串作为参数传递给BASH中的空格

时间:2019-10-08 10:11:08

标签: bash shell zsh

我有一个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 个答案:

答案 0 :(得分:2)

我会尽量避免使用eval,尽管我不介意在必要时使用它。在您的情况下,我可能会使用换行符作为arg分隔符,并相应地修改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[@]}"

答案 1 :(得分:0)

您可以在调用Consumer_args时使用'eval'。它将允许外壳程序将Produce 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