J'aime vraiment la suggestion @Michel. Parfois, vous pouvez vraiment extraire des valeurs de variables pour exécuter une tâche sur ce serveur spécifique à l'aide de BASH. Ainsi, les variables souhaitées sont connues. Cette utilisation de cette approche est le moyen d'éviter ou de multiples appels à jq pour définir une valeur par variable ou même d'utiliser l'instruction de lecture avec plusieurs variables dans lesquelles certaines peuvent être valides et vides, conduisant à un changement de valeur (c'était mon problème)
mon approche précédente qui conduit à une erreur de décalage de valeur si .svID [] .ID = "" ( sv obtiendra la valeur slotID
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
Si vous avez téléchargé l'objet à l'aide de curl, voici mon approche pour renommer certaines variables en un nom convivial comme extraire des données à partir de tableaux de données
utiliser eval et des filtres résoudra le problème avec une seule ligne et produira des variables avec le nom souhaité
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 )"
L'avantage dans ce cas, c'est le fait qu'il va filtrer, renommer, formater toutes les variables souhaitées dans la première étape. Observez cela dedans. [0] | il est très courant d'avoir si la source provient d'un serveur API RESTFULL utilisant GET, les données de réponse comme:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Si vos données ne proviennent pas d'un tableau, par exemple. est un objet comme:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
il suffit de supprimer l'index initial:
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 )"
C'est une vieille question, mais je me sentais partager, car il était difficile de trouver
declare -- “$key=$value”
et faire$AUTHOR
fonctionner etc. comme dans l'original, sans tableau. C'est toujours plus sûr qu'eval, bien que changerPATH
ou quelque chose soit encore possible donc moins que cette version.