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
配列要素に改行が含まれている場合、明らかに動作しません。