我正在尝试使用Azure CLI进行一些脚本编写。假设我的查询返回以下内容:
[
"a",
"b",
"c"
]
我想在bash循环中使用这些值。以以下形式获得它们会更好:
a
b
c
理想情况下,有没有一种方法可以使用JMESPath查询原语来做到这一点?否则,我将不得不使用bash命令,而这对于JMESPath来说仍然有很多不足之处。
答案 0 :(得分:1)
您似乎可以使用--out tsv
例如,az vm list --out tsv | grep RGD | cut -f8
KBDemo001VM
KBDemo020
的更多详细信息
答案 1 :(得分:1)
我在使用JMESPath查询输出方面并没有取得很大的成功。但是我发现使用jq比较容易解析返回的json。
例如,我需要将内部服务端点添加到特定虚拟网络内的所有子网中。我会将json输出传递到bash数组,并通过for循环使用json键值对执行命令。
update_subnet() {
subnet_service_endpoints="Microsoft.EventHub Microsoft.KeyVault Microsoft.ServiceBus Microsoft.Storage"
subnet_json=$(az network vnet subnet list --subscription ${subscription_name} --resource-group ${resource_group} --vnet-name ${virtual_network} --output json)
readarray -t SUBARR < <(echo ${subnet_json} | jq -c '.[]')
for SUBNET in "${SUBARR[@]}"
do
SUBNET_NAME=$(echo "${SUBNET}" | jq -r .name)
ADDRESS_PREFIX=$(echo "${SUBNET}" | jq -r .addressPrefix)
RESOURCE_GROUP=$(echo "${SUBNET}" | jq -r .resourceGroup)
RESULT=$(az network vnet subnet update --subscription ${subscription_name} --resource-group ${resource_group} --vnet-name ${virtual_network} --name ${SUBNET_NAME} --address-prefixes ${ADDRESS_PREFIX} --service-endpoints ${subnet_service_endpoints})
if [ "$RESULT" == "" ]
then
echo "Something happened and unable to parse command"
else
echo "${RESULT}"
fi
done
}