2014-10-29 24 views
1

我使用jq來解析JSON數據,並根據作爲命令行參數給出的動態鍵值提取出值。我注意到這是有效的,但我對它是如何在單引號內插入$v表示懷疑。是否可以用雙引號將表達式'.["\($v)"]'重寫?我究竟做錯了什麼?使用jq插值字符串

嘗試以下不管出於什麼原因不工作:

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" ".[\"\\($v)\"]")

然而,這並不:

recipe_key='Wilted Greens' # example key to interpolate 

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" '.["\($v)"]') # works! 
+0

你們兩個都是對的,我能從這個問題得到兩個觀點。主要關注的是爲什麼我錯誤地繼續使用雙引號並從中得出答案。這就是Stackoverflow的偉大之處;它更多的是到達答案,而不是得到一個明確的答案。 – theGrayFox 2014-10-30 00:56:07

+0

我沒有說「好」和「壞」。我表示,對於OP爲什麼要在單引號中避免使用任何和所有內插來確定他想要避免的插入以及哪個插值是他發佈的*確切*問題時,都不理解OP。 – 2014-10-30 01:03:21

+0

@EtanReisner我的觀點是,這不重要**爲什麼**他想要做到「壞」的方式。如同我所做的一樣,向他展示「壞」的方式,如果你喜歡的話,還有一個「更好」的方式,然後讓他決定。 – 2014-10-30 01:10:23

回答

2

您沒有逃過$v,使巴什認爲這是一個bash變量,可能是空的。 試試這個

".[\"\\(\$v)\"]" 
#  ^
#  | 
#  --- notice 

在我看來,正是在這種情況下使用使用--arg單引號更好。 --arg實施類似於awk -v,以確定這種類型的情況引用頭痛。

+0

一個兒子,我花了幾個小時試圖讓這個權利。你是怎麼認爲它把它想成一個bash變量的?另外,你覺得這樣做比使用單引號更有意義嗎? – theGrayFox 2014-10-30 00:33:00

+0

+1再次感謝史蒂文。我真的需要第二個意見,你說什麼更有意義。 – theGrayFox 2014-10-30 00:42:29

1

我注意到了這個效果,但我對它是如何在單引號內插入$ v表示懷疑。

單引號不要插值變量或評估其他任何東西。

沒有是單引號中的神奇。你甚至不能在單引號內跳過單引號。

您正在使用的引用/轉義問題僅存在,因爲您在此嘗試使用雙引號而不是單引號。