在BASH中将字符串作为带空格的参数传递
我有一个CLI程序,它将参数生成为另一个CLI程序的一个字符串。我从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
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 < /代码>的输出会产生不止一个连续空白的参数。谢谢您的解决方案!