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

在BASH中将字符串作为带空格的参数传递,bash,shell,zsh,Bash,Shell,Zsh,我有一个CLI程序,它将参数生成为另一个CLI程序的一个字符串。我从BASH打电话给他们。以下是我所拥有内容的简化版本: product_args(){ 回显“arg1”ar g2“arg3” } 消耗_args(){ 对于“$@”中的arg,请执行以下操作 回显“$arg” 完成 } TMP=“$(生产参数)” 消费参数$TMP 它打印: arg1 "ar g2" arg3 所以,论点2被分成了两个论点。如何看到这样的输出 arg1 ar g2 arg3 我可以更改生成器CLI程序和BA

我有一个CLI程序,它将参数生成为另一个CLI程序的一个字符串。我从BASH打电话给他们。以下是我所拥有内容的简化版本:

product_args(){
回显“arg1”ar g2“arg3”
}
消耗_args(){
对于“$@”中的arg,请执行以下操作
回显“$arg”
完成
}
TMP=“$(生产参数)”
消费参数$TMP
它打印:

arg1
"ar
g2"
arg3
所以,论点2被分成了两个论点。如何看到这样的输出

arg1
ar g2
arg3

我可以更改生成器CLI程序和BASH脚本,但不能更改使用者程序。我也可以使用
zsh
,但我认为这在我的情况下并不重要。

您可以使用“eval”在通话中使用参数。它将允许shell将来自product 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

我会尽量避免使用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[@]}"

哦,天哪,伙计!就这么简单!这是一个可怕的答案:(非常感谢!这只是在代码< >产品Agss/Copy>更改时提出的问题。例如,考虑一下,如果<代码>产品EngsARGS < /代码>的输出会产生不止一个连续空白的参数。谢谢您的解决方案!