为什么“cat”似乎迭代 JSON 数组?

为什么“cat”似乎迭代 JSON 数组?

cat当尝试在 bash 3.2 中输出包含 JSON 的定界文档时,我对这种行为感到困惑:

输入:

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF)

输出:

{"x":["a":1]}
{"x":["b":2]}

这是怎么回事?

答案1

这只是 bash 的 shell 变量扩展。在这种情况下,花括号之间的任何内容都将被迭代并扩展到表达式中。

$ echo var{1,2,3,4}
var1 var2 var3 var4

$ echo var{1..10}
var1 var2 var3 var4 var5 var6 var7 var8 var9 var10

答案2

不是答案,而是格式化的评论:

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF)
bash: warning: here-document at line 15 delimited by end-of-file (wanted `EOF')
bash: warning: here-document at line 15 delimited by end-of-file (wanted `EOF')
{"x":[{"a":1,"b":2}]}

将右括号另起一行

$ cat <(cat <<EOF
> {"x":[{"a":1,"b":2}]}
> EOF
> )
{"x":[{"a":1,"b":2}]}

显然,我无法重现:

$ echo $BASH_VERSION
4.3.39(1)-release

答案3

大括号扩展受“braceexpand”选项的约束。例如:

set +B
cat <(cat <<EOF
{"x":[{"a":1,"b":2}]}
EOF
)

生成单个 JSON 值。

相关内容