使用bash解析json数据

使用bash解析json数据

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

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

modules=$(/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)

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

["module-name-1","module-2","https:\/\/domain.com\/module\/packages\/mailmdule.zip"]

我想迭代此列表的每个元素并生成一行带有如下所示的命令

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 中的格式不同

我一直在通过 jq 寻找解决方案但没有成功,我尝试获得干净的输出:

$((/usr/bin/mysql  -u $MyUSER -p$MyPASS $DB_NAME -e "SELECT modules FROM myapp WHERE ID=31 " -B  -N)| jq '.[]'))

但我只得到

"module-name-1" "module-2" "https:\/\/domain.com\/module\/packages\/mailmdule.zip"

如有任何建议,将不胜感激

答案1

jq -r '.[] | @sh "install \(.) -yes --no-prompt"'

这将获取您的数组并将元素(为 shell 正确引用)插入到随后输出的字符串中。

给定您显示的数组,这会产生

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

jq -r '.[] | @sh "install \(.) -yes --no-prompt"' | sh -s

或者,您可以执行一个 shell 循环,从数组中读取数据并在install命令行中使用该数据,而不是尝试在以下位置构造有效命令jq

jq -r '.[]' |
while IFS= read module; do
    install "$module" -yes --no-prompt
done

如果任何数组元素包含嵌入的换行符,这显然不起作用。

相关内容