Mysql

使用 bash 解析 json 數據

  • February 16, 2021

我想根據儲存在 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

如果任何數組元素包含嵌入的換行符,這顯然不起作用。

引用自:https://unix.stackexchange.com/questions/634794