我想根据存储在 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
如果任何数组元素包含嵌入的换行符,这显然不起作用。