3

我正在使用 jq 解析 JSON 数据并根据作为命令行参数给出的动态键值提取一个值。我注意到这是可行的,但我对它如何$v在单引号内插值持怀疑态度。'.["\($v)"]'是否可以在双引号内重写表达式?我究竟做错了什么?

无论出于何种原因,尝试以下操作都不起作用:

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" ".[\"\\($v)\"]")

但是,这样做:

recipe_key='Wilted Greens' # example key to interpolate

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" '.["\($v)"]') # works!
4

2 回答 2

2

你没有逃脱$v,所以 Bash 认为它是一个 Bash 变量,可能是一个空的。尝试这个

".[\"\\(\$v)\"]"
#       ^
#       |
#       --- notice

在我看来,在这种情况下最好使用--arg单引号。--arg实现类似于 awk -v,以通过引用头痛来解决这种类型的情况。

于 2014-10-30T00:25:58.653 回答
1

我注意到这是可行的,但我对它如何在单引号内插入 $v 持怀疑态度。

单引号不会插入变量或评估其他任何内容。

单引号内没有什么是神奇的。您甚至无法在单引号内转义单引号。

您遇到的引用/转义问题仅因为您尝试在此处使用双引号而不是单引号而存在。

于 2014-10-30T01:14:41.227 回答