Shell-Script
使用 jq 從 json 獲取腳本列表
更新(開始):回答以下行,您已經回答了完整的問題:
為什麼會出現以下情況:
echo '{"ipv4":["192.168.64.193"]}'|jq .ipv4[0]
給出這個錯誤:
no matches found: .ipv4[0]
更新(結束)
我正在嘗試創建一個列表變數,其中包含來自此 json 的“ipv4”的值:
{ "list": [ { "ipv4": [ "192.168.64.193" ], "name": "node2", "release": "20.04 LTS", "state": "Running" }, { "ipv4": [ "192.168.64.192" ], "name": "node1", "release": "20.04 LTS", "state": "Running" } ] }
HOSTS 是 IP 地址的列表:
更新:感謝@Kusalananda,我在腳本中使用了它
HOSTS+=$(echo $i|jq '.ipv4[0]')
get_hosts(){ unset HOSTS # unset NAMES jq -c '.list[]' file.json | while read i; do HOSTS+=$(echo $i | jq .ipv4) # NAMES+=$(echo $i | jq .name) done echo $HOSTS # echo $HOSTS }
我得到:
[ "192.168.64.193" ][ "192.168.64.192" ]
但是我需要:
"192.168.64.193" "192.168.64.192"
所以我嘗試了:
... HOSTS+=$(echo $i | jq .ipv4[0]) ...
但後來我得到:
get_hosts:3: no matches found: .ipv4[0] get_hosts:3: no matches found: .ipv4[0]
注意:這是循環中的行之一:
{"ipv4":["192.168.64.193"],"name":"node2","release":"20.04 LTS","state":"Running"}
未加引號的字元串
.ipv4[]
是 shell globbing 模式。此模式與任何現有文件都不匹配,並且您使用的 shell 被配置為生成錯誤(zsh
預設情況下),而不是保留未擴展的模式(bash
預設情況下)。引用與 一起使用的表達式
jq
:echo '{"ipv4":["192.168.64.193"]}' | jq '.ipv4[0]'
要從您在問題中提供的數據中提取所有 IP 地址,請獲取數組的所有
ipv4
數組的所有元素list
:$ jq -r '.list[].ipv4[]' file 192.168.64.193 192.168.64.192
您不太可能需要將這些值放入數組中。相反,請一一閱讀並對它們做任何你需要做的事情:
jq -r '.list[].ipv4[]' file | while IFS= read -r ipaddr; do # use "$ipaddr" here done
要讀取每個名稱的名稱和第一個 IP 地址:
jq -r '.list[] | [ .name, .ipv4[0] ] | @tsv' file | while IFS=$'\t' read -r name ipaddr; do # use "$name" and "$ipaddr" here done
該
@tsv
運算符生成一個以製表符分隔的數組輸出,我們在這裡使用它來將名稱與數組中每個條目的相應 IP 地址配對list
。