2017-05-16 2 views
0

J'essaye d'éditer un fichier json dans un script shell avec le programme jq. Le fichier JSON a le format suivant:Ubuntu Shell Script - Utiliser jq avec des arguments

{ 
    "bla": { 
     "test1": "True", 
     "test2": "False" 
    } 
}´ 

Je veux définir un paramètre pour définir quelle valeur doit être changé de « bla ». Je veux commencer le script par exemple comme ceci:

$ ./myscript.sh test1

Je l'ai essayé comme ceci:

#!/bin/sh 

jq --arg v $1 '.pokemon.$v = "True"' filters.json > tmp.$$.json && mv tmp.$$.json filters.json 

Mais il ne fonctionne pas. Je reçois l'erreur suivante:

error: syntax error, unexpected '$', expecting IDENT 
.pokemon.$v = "True" 
     ^
1 compile error 

Quelqu'un sait comment résoudre ce problème?

+1

Citations. '--arg v" $ 1 "', sinon vous n'avez aucune garantie sur le nombre d'arguments séparés à 'jq'' $ 1' par le shell. –

+0

Les PID sont assez prévisibles, ce qui rend le code utilisant le modèle que vous suivez ici vulnérable aux attaques par liens symboliques (par exemple: Si vous utilisez jq comme root et créez '/ tmp/$$ .json', alors quelqu'un d'autre * * peut faire un tas de fichiers '/ tmp/* .json' qui sont des liens symboliques vers'/etc/passwd' et vous causer ainsi, sans le savoir, d'écraser '/ etc/passwd'. Utiliser 'mktemp' te pour créer vos fichiers temporaires n'a pas cette vulnérabilité, ou [la commande' inplace'] (https://github.com/nicowilliams/inplace). –

+1

@CharlesDuffy - 'jq -i' a une histoire torturée. En bref, il a été supprimé, mais sera probablement rétabli un jour. En attendant, «éponge» fonctionne bien pour beaucoup. – peak

Répondre

2

Vous devez utiliser la syntaxe [...] de subscripting au lieu de la syntaxe . si vous voulez utiliser une variable dans l'indice:

.pokemon[$v] = "True"