這是我的資料檔案:explorejq.json-
{
"apiVersion": "v1",
"data": {
"app.properties": "some.base64encoded.data"
},
"kind": "ConfigMap",
"metadata": {
"creationTimestamp": "2021-05-17T09:54:15Z",
"name": "myappproperties",
"namespace": "myappnamespace",
"resourceVersion": "352258550",
"selfLink": "/api/v1/namespaces/myappnamespace/configmap/myappproperties",
"uid": "cb23197e-54ee-412a-a07a-7d02df3d59a1"
},
"type": "IncorrectType"
}
我想檢索app.properties嵌套在data. 我知道這樣做的正確方法是使用 -
cat explorejq.json | jq '.data ' | jq '.["app.properties"]'或者
cat explorejq.json | jq '.data | .["app.properties"]' 我得到
輸出: "some.base64encoded.data" 根據需要
現在的問題是我的一個開發伙伴在最后一部分使用沒有單引號的 jq 命令。示例 -
cat explorejq.json | jq '.data ' | jq .["app.properties"] 或
cat explorejq.json | jq '.data ' | jq .[".app.properties"] 或
cat explorejq.json | jq '.data ' | jq .["., ., app.properties"] 并獲取
輸出 -
{
"app.properties": "some.base64encoded.data"
}
"some.base64encoded.data"
現在,我知道以上三種方式都是不正確的,但我需要了解這些情況下發生的情況,以便我可以解釋相同的情況。
有人可以解釋在沒有單引號的情況下使用 jq 命令時會發生什么,特別是在上述情況下會發生什么。
編輯 -
基本上這里的問題是jq .["app.properties"]. Shell 會在將其傳遞給 jq 之前對其進行解釋。
echo jq .["., ., app.properties"]輸出:jq ..。我提到的其余兩種模式也是如此。
所以在這里發布了一個新的 Q - jq 過濾器中的..(兩個點)是什么
uj5u.com熱心網友回復:
實際上,也cat explorejq.json | jq '.data ' | jq '."app.properties"'可以(或簡化為jq '.data."app.properties"' explorejq.json)。相關部分是"app.properties"用引號括起來的,因為它需要是一個 JSON 字串(在 jq 內)。反過來,整個 jq 過濾器也是呼叫環境(在 shell 內)的字串。這就是為什么您還需要參考過濾器(如果它包含空格、引號等)。但是,由于它包含 JSON 字串的雙引號,因此單引號是 jq 過濾器字串的合適選擇。如果您不使用這些外部引號,shell 會將內部引號解釋為字串邊界,因此它們將不再出現在實際的 jq 過濾器中。因此,jq 將無法呈現app.properties為實際的 JSON 字串。
uj5u.com熱心網友回復:
字串引號是 bash 腳本的一部分,如果要將包含空格的引數傳遞給命令,則需要使用引號。在您的情況下,引數不包含空格,因此不需要引號.["app.properties"]作為引數傳遞給jq.
在最后一種情況下,bash 將一個字串與作為一個引數.["., ., app.properties"]傳遞的兩個空格連接起來。jq
所以你的開發伙伴做的一切都是正確的 ;-) 雖然我自己也發現對整個 jq 程式使用簡單的引號更清晰。
uj5u.com熱心網友回復:
你已經想通了,外殼被加工.["., ., app.properties"]成..,但你可能沒有,為什么還沒有想通了。
不加引號的方括號是單個字符的模式匹配語法,類似于?任何單個字符*的通配符和零個或多個字符的通配符。在這種情況下,您已經為名稱以 開頭.并后跟 set., ., app.properties中簡化為 set 的任何單個字符的任何檔案創建了模式匹配., aeioprst。由于..存在于每個目錄中,因此它始終匹配并且您將獲得... 但是,例如,如果您.p在當前目錄中呼叫了一個檔案,它也會匹配,并且您需要向jq. 這個故事的直接教訓總是單引號你的過濾器引數jq. 更廣泛的道德是很難學習和記住所有的 shell 規則和行為,但記住一個安全的子集要容易得多。如果您知道單引號會逐字傳遞整個引數,并且如果您對包含不確定字符的任何引數堅持使用它們,那么您就不必擔心所有您不知道的事情。
uj5u.com熱心網友回復:
您可能希望利用-fjq的選項,您可以將過濾程式放在一個檔案中,并讓 jq 從檔案中讀取它。這使您免于 shell 參考的麻煩。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394945.html
上一篇:yqjson到yaml向dockercompose標簽添加引號
下一篇:HTTP回應決議
