我刚开始使用bash脚本。我正在迭代一个列表,并希望从一个JSON对象中获得这个值。我已经试过所有这三种了,我得到了一个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)发布于 2022-10-28 03:29:56
主要问题似乎在于您的json数据,因为您有:
{'a': 'apple', 'b', 'bananna'}据我所知,使用单引号无效(使用双引号):json格式。我看到的另一个问题是,在'b'和'bannana'之间有一个逗号D3(我假设您没有注意到这一点,并且键入了,而不是:)。
所以你的json数据应该是这样的:
{"a": "apple", "b": "bananna"}What是获取键的正确语法?
我通常看到语法'.key'被更多地使用。不过,我认为你应该使用任何有用的。例如,在您的示例中,我看到您正在使用变量$key从json键中获取特定值。因此,您应该使用类似于".$key"或."$key",.$key之类的东西(我不确定是否推荐这样做):
Solution 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的说法:
单引号(')中包含的字符保留引号中每个字符的文字值。单引号之间可能不会出现单引号,即使前面有反斜杠。
因此,如果您希望通过指定一些键来对json值使用single quotes,则应该使用:
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,您可以尝试:
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))'https://unix.stackexchange.com/questions/722766
复制相似问题