有没有一种简单的方法通过 jq 存储 bash 变量?

有没有一种简单的方法通过 jq 存储 bash 变量?

我正在寻找一种简单的方法来创建持久的 bash 关联数组(字典)存储,而不使用declare其选项来手动从外部读取和写入关联数组。

“jq”和“json”存储当然比内部 bash 存储更强大,但在大量“jq”信息中,我无​​法找到将 bash 与“jq”连接的简单答案。

我可以使用jqJSON文件来存储/调用/删除 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$V1给,$?因为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)来模拟 的内联替换FILEJSON=$(jq ...)可以使用类似的任何其他方法,但如果在和无法停止的过程中发生错误(很容易由格式错误的输入或文字引起),jq ... FILE | sponge FILE则会导致sponge清空。好的一面是,如果在生成输入的过程中发生错误,则停止执行并保持完整。FILEjqset -eset -o pipefailsponge FILE < <(jq ... FILE)spongeFILE

相关内容