Bash脚本中调用jq获取含点号的JSON键值执行失败如何解决
问题根源
你遇到的是Bash命令解析的转义和分词问题:将完整命令存入字符串变量再执行是常见错误写法,Bash不会对字符串内的引号、转义符做预期的语法解析,只会按空格拆分参数,导致jq收到的过滤表达式不符合预期,因此直接输出了表达式本身而非查询结果。
最优解决方案
优先使用jq的--arg参数将Bash变量传入jq内部,完全避免转义噩梦,对包含特殊字符(点号、引号、空格等)的键都能兼容,鲁棒性更高,完全适配你当前的运行环境:
#!/bin/bash file="sample.json" key="foo.bar" # --arg 会把Bash的$key变量值传给jq内部的$k变量,单引号包裹jq表达式避免Bash解析 result=$(jq -r --arg k "$key" '.[$k]' "$file") statusCode=$? echo "result $result, statusCode $statusCode"
替代方案
如果你不想使用传参方式,直接在执行时写jq语句即可,不要提前把完整命令存入字符串变量:
#!/bin/bash file="sample.json" key="foo.bar" result=$(jq -r ".[\"$key\"]" "$file") statusCode=$? echo "result $result, statusCode $statusCode"
内容的提问来源于stack exchange,提问作者Andrei Nagy
相关产品推荐
相关产品推荐

