在jq读取查询中使用变量 [英] Use variable in jq read query

查看:78
本文介绍了在jq读取查询中使用变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下json文件

cat permissions.json

{
  "foo1.bar1@email.com": [
    "projects/development/roles/superadmin",
    "compute.networkAdmin"
  ],
  "foo2.bar2@email.co": [
    "compute.networkAdmin"
  ]
}

现在,我可以用jq

$ jq -r '.["foo1.bar1@email.com"]' permissions.json
[
  "projects/development/roles/superadmin",
   "compute.networkAdmin"
]

现在电子邮件需要来自变量

Now the email needs to come from a variable

所以我的for循环是如此

So my for loop is such that

for USER in $(jq -r 'keys[]' permissions.json)
do
  echo ${USER}
  for ROLE in $(jq -r '.["$USER"][]' permissions.json)
  do
    echo "User ${USER} has role ${ROLE}"
  done
done

但是当我跑步

./compare-permissions.sh
foo1.bar1@email.com
jq: error (at permissions.json:9): Cannot iterate over null (null)
foo2.bar2@email.co
jq: error (at permissions.json:9): Cannot iterate over null (null)

我尝试将var作为--arg发送.我做了这样的事

Ive tried sending the var as an --arg. Ive done something like this

USER=foo1.bar1@email.com
jq -r --arg USER "$USER" '.["$USER"][] | select(.[]==$USER)'  permissions.json

但是结果为空.那么如何使用电子邮件作为变量并使用jq提取权限?

But the result is empty. So how can I use the email as a variable and extract the permissions out of it using jq ?

推荐答案

不要使用字符串插值;将变量作为参数传递.

Don't use string interpolation; pass the variable as an argument.

for user in $(jq -r 'keys[]' permissions.json)
do
  echo ${user}
  for role in $(jq --arg u "$user" -r '.[$u][]' permissions.json)
  do
    echo "User ${user} has role ${role}"
  done
done

此外,请勿使用for循环迭代命令的输出.使用while循环和read命令.

Also, don't use for loops to iterate over the output of a command. Use a while loop and the read command.

while IFS= read -r user; do
  echo "$user"
  while IFS= read -r role; do
    echo "User $user has role $role"
  done < <(jq --arg u "$user" -r '.[$u][]' permissions.json
done < <(jq -r 'keys[]' permissions.json)  

但是,您可能根本不需要shell循环.

However, you may not need a shell loop at all.

% jq -r 'keys[] as $user | .[$user][] | "User \($user) has role \(.)"' permissions.json
User foo1.bar1@email.com has role projects/development/roles/superadmin
User foo1.bar1@email.com has role compute.networkAdmin
User foo2.bar2@email.co has role compute.networkAdmin

这篇关于在jq读取查询中使用变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆