Mysql
使用 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"
將不勝感激任何建議
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
如果任何數組元素包含嵌入的換行符,這顯然不起作用。