2017-05-16 68 views
0

我試圖用jq程序在shell腳本中編輯json文件。該json文件有以下格式:Ubuntu Shell腳本 - 使用jq和args

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

我想設置一個參數來定義「bla」應該改變哪個值。我要開始例如這樣的腳本:

$ ./myscript.sh test1

我想它是這樣的:

#!/bin/sh 

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

但它無法正常工作。我收到以下錯誤:

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

有人知道如何解決這個問題嗎?

+1

行情。 '--arg v「$ 1」',否則你不能保證''jq''$ 1'被shell解析了多少個單獨的參數。 –

+0

PIDs是相當可預測的,使得使用你在這裏遵循的模式的代碼容易受到符號鏈接攻擊(作爲一個具體例子:如果你以root身份運行'jq'並創建'/ tmp/$$。json',那麼有人* else *可以創建一堆'/ tmp/*。json'文件,這些文件符號鏈接到'/ etc/passwd',從而導致你在不知不覺中覆蓋'/ etc/passwd')。使用'mktemp' te創建您的臨時文件沒有此漏洞,或者[inplace'命令](https://github.com/nicowilliams/inplace)。 –

+1

@CharlesDuffy - 'jq -i'有一個折磨的歷史。簡而言之,它已被刪除,但有可能在一天後重新設置。與此同時,「海綿」對許多人來說運作良好。 – peak

回答

2

你需要的,如果你想在標使用變量使用[...]下標語法而不是.語法:

.pokemon[$v] = "True"