如何在bash脚本中动态查找json中的键值对的值

如何在bash脚本中动态查找json中的键值对的值

我是 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 quotesdouble 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))'

相关内容