【发布时间】:2019-12-01 15:32:02
【问题描述】:
我有以下 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"
]
现在邮件需要来自一个变量
所以我的 for 循环是这样的
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 发送。我做过类似的事情
USER=foo1.bar1@email.com
jq -r --arg USER "$USER" '.["$USER"][] | select(.[]==$USER)' permissions.json
但是结果是空的。那么如何使用电子邮件作为变量并使用jq 从中提取权限?
【问题讨论】:
-
请注意,
for var in $(anything)是不好的做法——如果在 jq 的输出中有一个被空格包围的*,您会发现自己在遍历文件名(这只是许多可能的错误之一)。请参阅 BashPitfalls #1 以获取解释,BashFAQ #1 了解逐行迭代输入流的最佳实践方法的解释。 -
如果你真的想保留当前的结构,在你的代码前面加上
IFS=$'\n'并不能修复不需要的通配符(set -f会这样做,但它会禁用 all globbing,所以你以后经常想用set +f来反转它),但单独更改 IFS确实 至少可以阻止 jq 的输出除了换行符之外的其他空格。
标签: json bash variables iteration jq