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"'

これにより、配列が取得され、出力される文字列に要素(シェルに対して正しく引用されている)が挿入されます。

示された配列を考えると、次のようになります。

install 'module-name-1' -yes --no-prompt
install 'module-2' -yes --no-prompt
install 'https://domain.com/module/packages/mailmdule.zip' -yes --no-prompt

一重引用符、スペースなどを含む配列要素は正しく処理されます。

シェルでこれらのコマンドを実行するには、次のようにパイプしますsh -s

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

または、次のようinstallに有効なコマンドを設定する代わりに、配列からデータを読み込み、コマンドラインからそのデータを使用するシェルループを実行することもできます。jq

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

配列要素に改行が含まれている場合、明らかに動作しません。

関連情報