我是 bash 脚本新手。我正在迭代列表并希望从 JSON 对象获取值。我已经尝试了所有这 3 个并且得到了jq: 1 compile error
正确的语法是什么?
for key in $KEYS
echo "ALIASES:" $ALIASES
# ALIASES: {'a': 'apple', 'b': 'bananna'}
FRUIT=$(echo $ALIASES | jq ."$key" -r)
FRUIT=$(echo $ALIASES | jq .'$key' -r)
FRUIT=$(echo $ALIASES | jq .$key -r)
答案1
主要问题似乎出在您的 json 数据中,因为您有:
{'a': 'apple', 'b', 'bananna'}
据我所知,使用单引号是无效的(使用双引号):json格式。
我看到的另一个问题是你在and,
之间有一个逗号(我假设你没有注意到这一点并且你输入了而不是)'b'
'bannana'
,
:
所以你的 json 数据应该是这样的:
{"a": "apple", "b": "bananna"}
获取密钥的正确语法是什么?
我通常看到语法'.key'
用得比较多。不过我认为你应该使用任何有效的。例如,我发现您正在使用变量$key
从 json 键获取特定值。所以,你应该使用类似".$key"
或可能的东西."$key"
,.$key
(我不确定是否推荐这些):
解决方案1
FRUIT=$(echo $ALIASES | jq ".$key" -r)
#or
FRUIT=$(echo $ALIASES | jq ."$key" -r)
#or
FRUIT=$(echo $ALIASES | jq .$key -r)
如果您使用或想要使用,single quotes
那么您将无法将任何变量值传递给jq
命令。根据man bash
:
将字符括在单引号 (') 中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠
因此,如果您想single quotes
通过指定某个键来使用 json 值,您应该使用:
FRUIT=$(echo $ALIASES | jq '.somekey' -r)
#e.g.
FRUIT=$(echo $ALIASES | jq '.a' -r)
echo $FRUIT
#Output:
apple
你可以检查这些答案为了更好地理解single quotes
和double quotes
解决方案 2(使用 jq --arg)
我不确定为什么上面的代码不适合你(使用双引号)。然而,还有另一种可能的解决方案将变量传递给jq
,您可以尝试:
val="a"
echo $ALIASES | jq --arg key "$val" '.[$key]' -r
当您使用 python 获取 json 时,您应该使用该方法json.dumps(your_json)
,例如:
python3 -c 'import json;aliases = json.load(open("file"));print(json.dumps(aliases))'