Saya sangat suka saran @Michel. Terkadang, Anda mungkin benar-benar mengekstrak beberapa nilai variabel untuk menjalankan tugas di server tertentu menggunakan BASH. Jadi, variabel yang diinginkan adalah tahu. Ini menggunakan pendekatan ini adalah cara untuk menghindari atau beberapa panggilan ke jq untuk menetapkan nilai per variabel atau bahkan untuk menggunakan pernyataan baca dengan beberapa variabel di mana beberapa dapat valid dan kosong, yang mengarah ke pergeseran nilai (yang merupakan masalah saya)
Pendekatan saya sebelumnya yang mengarah akan menyebabkan kesalahan nilai pergeseran jika .svID [] .ID = "" ( sv akan mendapatkan slotID nilai
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Jika Anda mengunduh objek menggunakan curl, berikut adalah pendekatan saya untuk mengubah nama beberapa variabel menjadi nama yang ramah sebagai mengekstrak data dari array data
menggunakan eval dan filter akan menyelesaikan masalah dengan satu baris dan akan menghasilkan variabel dengan nama yang diinginkan
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 )"
Keuntungan dalam hal ini, adalah kenyataan bahwa ia akan memfilter, mengganti nama, memformat semua variabel yang diinginkan pada langkah pertama. Perhatikan bahwa ada. [0] | yang sangat umum untuk memiliki jika sumber jika dari server API RESTFULL menggunakan GET, respons data sebagai:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Jika data Anda bukan dari array, mis. adalah objek seperti:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
hapus saja indeks awal:
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 )"
Ini adalah pertanyaan lama, tetapi saya merasa berbagi, karena sulit ditemukan
declare -- “$key=$value”
dan memiliki$AUTHOR
pekerjaan dll seperti pada aslinya, tanpa array. Ini masih lebih aman daripada eval, meskipun perubahanPATH
atau sesuatu masih mungkin jadi kurang dari versi ini.