我有一个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
,但我认为这并不重要。
答案 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