使用JMESPath contains函数查询Azure存储Blob时出现语法错误
Azure存储Blob筛选:JMESPath查询语法错误修复
我在检索Azure存储容器中的Blob时,想筛选出名称包含R00005006的Blob,但使用带JMESPath contains函数的--query参数时触发了语法错误。
正常运行的命令
以下命令可以正常列出所有Blob名称:
az storage blob list \ --account-name $account_name \ --account-key $key \ --num-results $numResults \ --show-next-marker \ --container-name $container_name \ --query [].name
错误写法及报错
修改--query参数为以下两种写法时,都会触发报错:
写法1:
--query [].name[?contains(@,'R00005006')=='true']
写法2:
--query [].name[?contains(@,'R00005006')]
报错信息:
syntax error near unexpected token `('
解决办法
问题根源是Shell解析冲突:Bash会把JMESPath表达式里的括号、单引号当成特殊命令字符解析,导致语法错误。只需把整个--query的JMESPath表达式用双引号包裹,就能避免Shell干扰。
推荐两种正确写法:
写法1:先筛选再提取名称(更高效)
在API返回阶段就完成筛选,减少本地处理的数据量:
az storage blob list \ --account-name $account_name \ --account-key $key \ --num-results $numResults \ --show-next-marker \ --container-name $container_name \ --query "[?contains(name,'R00005006')].name"
写法2:先提取名称再过滤(匹配原思路)
先获取所有Blob名称,再对名称列表做过滤:
az storage blob list \ --account-name $account_name \ --account-key $key \ --num-results $numResults \ --show-next-marker \ --container-name $container_name \ --query "[].name|[?contains(@,'R00005006')]"
补充说明:
- JMESPath的
contains函数直接返回布尔值,不需要额外和'true'做比较,用[?contains(...)]就能完成过滤。 - 必须用双引号包裹整个表达式,确保Shell把它作为单一参数传递给
az命令。
内容的提问来源于stack exchange,提问作者Priyank Shukla
相关产品推荐
相关产品推荐

