我想根据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中的URL格式不同
我正在通过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"如果有任何建议的话
发布于 2021-02-16 15:03:25
jq -r '.[] | @sh "install \(.) -yes --no-prompt"'这将接受数组并将正确引用的元素插入到字符串中,然后输出该字符串。
给定所显示的数组,这将产生
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如果任何数组元素都包含嵌入式换行符,这显然是行不通的。
https://unix.stackexchange.com/questions/634794
复制相似问题