如何修正Shell中jq语法,判断JSON数组是否包含字符串变量
问题原因与解决方法
你的问题出在Shell单引号的变量解析规则:当你用单引号包裹jq表达式时,Shell不会解析单引号内部的$favorite_food变量,而是把它当成一个字面字符串"$favorite_food"去匹配数组元素,自然找不到对应的值,所以返回false。
正确的写法有两种:
方法1:用jq的--arg参数传递变量(推荐)
这是jq官方推荐的传递外部变量的方式,能避免Shell字符串转义的问题,兼容性更好:
in_stock=$(jq -n --argjson v '["orange","apple","pickle"]' '$v') favorite_food="pickle" echo $in_stock | jq --arg food "$favorite_food" 'contains([$food])' # 输出:true
--arg food "$favorite_food"会把Shell变量的值传递给jq内部的$food变量,在jq表达式里直接用$food就能拿到正确的变量值。
方法2:用Shell双引号让变量展开
如果一定要用Shell变量展开,需要把jq表达式放在双引号里,同时转义jq里的双引号(避免和Shell的双引号冲突):
echo $in_stock | jq "contains([\"$favorite_food\"])" # 输出:true
这种方式要注意,如果变量里包含特殊字符(比如引号、反斜杠),可能会导致jq解析出错,所以优先用方法1。
内容的提问来源于stack exchange,提问作者stat_is_quo
相关产品推荐
相关产品推荐

