@Michel önerisini gerçekten çok seviyorum. Bazen, BASH kullanarak belirli bir sunucuda bir görevi yürütmek için bazı değişkenler değerini gerçekten ayıklayabilirsiniz. Böylece istenen değişkenler bilinir. Bu yaklaşımı kullanan bu, değişken başına bir değer ayarlamak için jq'ye yapılan birden çok çağrıdan kaçınmanın veya bazılarının geçerli ve boş olabileceği birden fazla değişkenle okuma deyimini kullanmanın bir değer kaymasına (bu benim sorunumdu) yol açmanın yoludur
Kurşun bir değer kayması hatası .svID [] .kimlik eğer = "" (yol açacağı önceki yaklaşım sv alacak slotID değeri
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Nesneyi curl kullanarak indirdiyseniz, veri dizilerinden veri ayıklama olarak bazı değişkenleri kolay bir adla yeniden adlandırma yaklaşımım
eval ve filtreleri kullanmak sorunu bir satırla çözecek ve istenen isimde değişkenler üretecektir
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 )"
Bu durumda avantaj, ilk adımda istenen tüm değişkenleri filtreleyecek, yeniden adlandıracak, biçimlendirecek olmasıdır. İçinde olduğunu gözlemleyin. [0] | GET kullanan bir RESTFULL API sunucusundan kaynak yanıt verisi aşağıdaki gibi olması çok yaygındır:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Verileriniz bir diziden değilse, yani. şunun gibi bir nesnedir:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
sadece başlangıç dizinini kaldırın:
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 )"
Bu eski bir soru, ama paylaşmak zor hissettim, çünkü bulmak zor
declare -- “$key=$value”
ve$AUTHOR
dizi olmadan orijinaldeki gibi vb. Çalışabilirsiniz.PATH
Bu versiyondan çok daha az değişiklik olsa da, yine de eval'den daha güvenlidir .