首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用bash解析json数据

用bash解析json数据
EN

Unix & Linux用户
提问于 2021-02-16 14:47:24
回答 1查看 457关注 0票数 1

我想根据mysql表中存储的数据生成一些命令。

要获取数据并将它们存储在变量中,请执行以下操作

代码语言:javascript
复制
modules=$(/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)

在数据库中,数据以json格式存储:

代码语言:javascript
复制
["module-name-1","module-2","https:\/\/domain.com\/module\/packages\/mailmdule.zip"]

我希望迭代这个列表中的每个元素,并生成一行命令,如下所示

代码语言:javascript
复制
install module-name-1 -yes --no-prompt 
install module-2 -yes --no-prompt 
install https://domain.com/module/packages/mailmdule.zip -yes --no-prompt

请注意,最后一个命令中的URL格式与json中的URL格式不同

我正在通过jq寻找一个解决方案,但没有成功,我试图获得一个清晰的输出:

代码语言:javascript
复制
$((/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)| jq '.[]'))

但我只得到

代码语言:javascript
复制
"module-name-1" "module-2" "https:\/\/domain.com\/module\/packages\/mailmdule.zip"

如果有任何建议的话

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-02-16 15:03:25

代码语言:javascript
复制
jq -r '.[] | @sh "install \(.) -yes --no-prompt"'

这将接受数组并将正确引用的元素插入到字符串中,然后输出该字符串。

给定所显示的数组,这将产生

代码语言:javascript
复制
install 'module-name-1' -yes --no-prompt
install 'module-2' -yes --no-prompt
install 'https://domain.com/module/packages/mailmdule.zip' -yes --no-prompt

包含单引号和空格等的数组元素将被正确处理。

若要在shell中运行这些命令,请将它们输送到sh -s

代码语言:javascript
复制
jq -r '.[] | @sh "install \(.) -yes --no-prompt"' | sh -s

或者,只需执行一个shell循环,从数组读取数据,并在install命令行中使用该数据,而不是试图在jq中构造一个有效的命令:

代码语言:javascript
复制
jq -r '.[]' |
while IFS= read module; do
    install "$module" -yes --no-prompt
done

如果任何数组元素都包含嵌入式换行符,这显然是行不通的。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/634794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档