我正在寻找一种简单的方法来创建持久的 bash 关联数组(字典)存储,而不使用declare
其选项来手动从外部读取和写入关联数组。
“jq”和“json”存储当然比内部 bash 存储更强大,但在大量“jq”信息中,我无法找到将 bash 与“jq”连接的简单答案。
我可以使用jq
和JSON
文件来存储/调用/删除 bash 中的持久键控字符串值,而不是使用易失性 bash 关联数组吗?
注意:感谢您的评论,我相信我已经更好地表达了我的问题,但添加示例不适用于此问题。
答案1
读
读取一个值非常容易,通过--raw-output
删除输出中的 js 引用并// empty
删除null
(and false
) 输出...
echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --raw-output '.V // empty' d)
--exit-status
如果你想区分空字符串值和未找到哪个 js 调用,请使用null
...
echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --exit-status --raw-output '.X' d)
分配null
给$V
和1
给,$?
因为X
找不到键。
写
通过传递一个值--arg NAME VALUE
会导致jq
接受VALUE
作为命令行参数并分配它的JSON
字符串表示形式NAME
,可以在jq
输入中引用为$ARGS.named.NAME
...
echo '{"Z":"zee","V":"vee"}' > d
V=$'This\tis a fancy\nvalue containing "quotes" and more \\'
sponge d < <(jq --arg V "$V" '."V"=$ARGS.named.V' d)
通过传递值--rawfile NAME FILE
会导致jq
接受内容FILE
并分配其JSON
字符串表示形式NAME
,可以在jq
输入中将其引用为$NAME
...
echo '{"Z":"zee","V":"vee"}' > d
sponge d < <(jq --rawfile V <(printf 'This\tis a fancy\nvalue containing "quotes" and more \\') '."V"=$V' d)
删除
删除一个值很容易...
sponge d < <(jq 'del(.V)' d)
评论
此处的示例使用该表单sponge FILE < <(jq ... FILE)
来模拟 的内联替换FILE
。JSON=$(jq ...)
可以使用类似的任何其他方法,但如果在和无法停止的过程中发生错误(很容易由格式错误的输入或文字引起),jq ... FILE | sponge FILE
则会导致sponge
清空。好的一面是,如果在生成输入的过程中发生错误,则停止执行并保持完整。FILE
jq
set -e
set -o pipefail
sponge FILE < <(jq ... FILE)
sponge
FILE