Mi piace molto il suggerimento @Michel. A volte, puoi semplicemente estrarre il valore di alcune variabili per eseguire un'attività in quel server specifico usando BASH. Quindi, le variabili desiderate sono note. Questo uso di questo approccio è il modo per evitare o più chiamate a jq per impostare un valore per variabile o addirittura per utilizzare l'istruzione read con più variabili in cui alcune possono essere valide e vuote, portando a uno spostamento del valore (questo era il mio problema)
il mio approccio precedente che porta a un errore di spostamento del valore se .svID [] .ID = "" ( sv otterrà il valore slotID
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Se hai scaricato l'oggetto usando curl, ecco il mio approccio per rinominare alcune variabili con un nome descrittivo come estrarre i dati dagli array di dati
l'utilizzo di eval e filtri risolverà il problema con una riga e produrrà variabili con il nome desiderato
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 )"
Il vantaggio in questo caso è il fatto che filtrerà, rinominerà, formatterà tutte le variabili desiderate nel primo passaggio. Osserva che dentro c'è. [0] | che è molto comune avere se l'origine proviene da un server API RESTFULL che utilizza GET, dati di risposta come:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Se i tuoi dati non provengono da un array, ad es. è un oggetto come:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
basta rimuovere l'indice iniziale:
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 )"
Questa è una vecchia domanda, ma ho sentito la condivisione, poiché era difficile da trovare
declare -- “$key=$value”
e far$AUTHOR
funzionare ecc come nell'originale, senza un array. È ancora più sicuro di eval, anche se cambiarePATH
o qualcosa è ancora possibile, quindi meno di questa versione.