首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash脚本中动态地找到json中键值的值

问如何在bash脚本中动态地找到json中键值的值
EN

Unix & Linux用户
提问于 2022-10-28 02:46:27
回答 1查看 2.1K关注 0票数 0

我刚开始使用bash脚本。我正在迭代一个列表,并希望从一个JSON对象中获得这个值。我已经试过所有这三种了,我得到了一个jq: 1 compile error

正确的语法是什么?

代码语言:javascript
复制
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)
EN

回答 1

Unix & Linux用户

发布于 2022-10-28 03:29:56

主要问题似乎在于您的json数据,因为您有:

代码语言:javascript
复制
{'a': 'apple', 'b', 'bananna'}

据我所知,使用单引号无效(使用双引号):json格式。我看到的另一个问题是,在'b'和'bannana'之间有一个逗号D3(我假设您没有注意到这一点,并且键入了,而不是:)。

所以你的json数据应该是这样的:

代码语言:javascript
复制
{"a": "apple", "b": "bananna"}

What是获取键的正确语法?

我通常看到语法'.key'被更多地使用。不过,我认为你应该使用任何有用的。例如,在您的示例中,我看到您正在使用变量$key从json键中获取特定值。因此,您应该使用类似于".$key"或."$key",.$key之类的东西(我不确定是否推荐这样做):

Solution 1

代码语言:javascript
复制
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的说法:

单引号(')中包含的字符保留引号中每个字符的文字值。单引号之间可能不会出现单引号,即使前面有反斜杠。

因此,如果您希望通过指定一些键来对json值使用single quotes,则应该使用:

代码语言:javascript
复制
FRUIT=$(echo $ALIASES | jq '.somekey' -r)
#e.g.
FRUIT=$(echo $ALIASES | jq '.a' -r)
echo $FRUIT
#Output:
apple

您可以检查这些答案以更好地了解single quotes和double quotes

Solution 2(使用jq )我不知道为什么上面的代码不适合您(使用双引号)。但是,还有一种可能的解决方案可以将变量传递给jq,您可以尝试:

代码语言:javascript
复制
val="a"
echo $ALIASES | jq --arg key "$val" '.[$key]' -r

当您使用python获取json时,您应该使用json.dumps(your_json)方法,例如:

代码语言:javascript
复制
python3 -c 'import json;aliases = json.load(open("file"));print(json.dumps(aliases))'
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/722766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档