Bash 循环遍历带空格的变量

Bash 循环遍历带空格的变量,bash,Bash,这段代码按预期工作: for var in a 'b c' d; do echo $var; done bash脚本循环执行3个参数 a b c d 但是,如果通过jq读入该字符串,然后像这样循环: JSON_FILE=path/to/jsonfile.json ARGUMENTS=$(jq -r '.arguments' "${JSON_FILE}") for var in ${ARGUMENTS}; do echo $var; done

这段代码按预期工作:

for var in a 'b c' d; 
do 
    echo $var; 
done
bash脚本循环执行3个参数

a
b c
d
但是,如果通过jq读入该字符串,然后像这样循环:

JSON_FILE=path/to/jsonfile.json
ARGUMENTS=$(jq -r '.arguments' "${JSON_FILE}")

for var in ${ARGUMENTS};
do 
    echo $var; 
done
结果是4个参数,如下所示:

a
'b
c'
d
示例json文件供参考:

{
    "arguments" : "a 'b c' d"
}
这是什么原因?我试着在变量周围加上引号,就像在其他SO答案中建议的那样,但这导致所有内容都被当作一个参数处理

我可以做什么来获得第一种情况(3个参数)的行为

这是什么原因

该数据是其他扩展的未引用结果。因为${ARGUMENTS}在${ARGUMENTS}中的变量在中的扩展不带引号,执行分词。不,分词会忽略变量扩展导致的引号-它只关心空格

我可以做什么来获得第一种情况(3个参数)的行为

好办法™ 将是编写自己的解析器,解析字符串中的引号,并根据引号拆分参数

我建议使用
xargs
,它(默认情况下,通常是一种令人困惑的行为)解析输入字符串中的引号:

$ arguments="a 'b c' d"
$ echo "${arguments}" | xargs -n1 echo 
a
b c
d
# convert to array
$ readarray -t -d '' arr < <(<<<"${arguments}" xargs -n1 printf "%s\0")
$arguments=“a'b c'd”
$echo“${arguments}”| xargs-n1 echo
A.
b c
D
#转换为数组

$readarray-t-d''arr<这是否回答了您的问题?这与jq无关,严格来说这是一个shell问题。您可以使用
xargs
解析引用的字符串(请参阅我对超级用户问题的回答)(前提是字符串中的引用/转义与
xargs
语法匹配)。这可能很难实现,具体取决于
while
循环中的实际内容,但在最坏的情况下,您应该能够将其解析为一个bash数组,然后在“${arrayvar[@]}”
中使用
for var对其进行循环,考虑将参数的格式更改为数组,然后将数组内容输出到while循环。问题似乎有点混乱。拥有像“a'bc'd”这样的JSON字符串似乎不太可能,但如果这是您真正拥有的,那么您必须根据您的需求在jq中解析它(它们是什么?),或者将其传递给某个外部程序进行解析。