@Michelの提案が本当に好きです。場合によっては、BASHを使用して特定のサーバーでタスクを実行するために、いくつかの変数の値を抽出することがあります。したがって、目的の変数はわかっています。これは、このアプローチを使用して、変数ごとに値を設定するためのjqへの複数の呼び出しを回避したり、複数の変数を使用してreadステートメントを使用したりすることができます。
.svID [] .ID = ""(svはslotID値を取得する場合、リードする私の以前のアプローチは値シフトエラーを引き起こします
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
curlを使用してオブジェクトをダウンロードした場合、データ配列からデータを抽出するために、いくつかの変数の名前をわかりやすい名前に変更する私のアプローチは次のとおりです
evalとfiltersを使用すると、1行で問題が解決され、目的の名前の変数が生成されます
eval "$(jq -r '.[0] | {varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
この場合の利点は、最初のステップで必要なすべての変数をフィルタリング、名前変更、フォーマットすることです。があることを確認してください。[0] | これは、ソースがGETを使用したRESTFULL APIサーバーからの場合、応答データが次のような場合に非常に一般的です。
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
あなたのデータが配列からのものでない場合、すなわち。次のようなオブジェクトです:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
最初のインデックスを削除するだけです:
eval "$(jq -r '{varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
これは古い質問ですが、見つけるのが難しかったので共有を感じました
declare -- “$key=$value”
し、持って$AUTHOR
配列することなく、元のようになどの作業を。evalよりも安全ですが、変更PATH
や何かがまだ可能であるため、このバージョンよりも安全ではありません。