如何避免Bash/Shell处理变量时跳过引号引发jq执行报错
问题原因
- Bash数组定义语法错误:数组赋值等号两侧不能加空格,你写的
domain= ("*.abc"...)会被Bash识别为执行domain命令,后面的括号内容作为参数,本身就不符合语法 - 数组展开未加引号:直接写
${domain[@]}没有外层双引号包裹时,Bash会自动对*做通配符展开,匹配当前目录下的对应文件名,不会保留原始的*开头字符串 - jq参数用错:
--arg仅用于传递单个字符串参数,无法接收整个数组,你传入多个值时,数组除第一个元素外的内容会被jq当成过滤器代码解析,碰到*就会抛出语法错误
正确实现方法
首先修正数组定义,等号两侧不要留空格,传参时给数组展开加双引号,用jq专门接收多参数的--args标识传递数组内容:
# 正确定义Bash数组 domain=("*.abc" "*.xyz" "*.123") # 生成带Items字段的JSON jq -n '{Items: $ARGS.positional}' --args "${domain[@]}"
执行后会输出标准合规的JSON内容:
{ "Items": [ "*.abc", "*.xyz", "*.123" ] }
如果需要修改已存在的JSON文件,直接替换文件内的Items字段,可以用原地修改的写法:
domain=("*.abc" "*.xyz" "*.123") # 假设原文件名为config.json jq '.Items = $ARGS.positional' config.json --args "${domain[@]}" > tmp_config.json && mv tmp_config.json config.json
注意事项
- 所有Bash数组展开为
"${domain[@]}"的格式必须加外层双引号,否则Bash会自动做通配符展开、空格拆分,破坏原始值 - 你给出的目标格式最后一个元素后带尾逗号,属于非标准JSON语法,绝大多数JSON解析器都会报错,jq默认生成的是合规标准JSON,不建议额外加尾逗号
- 不要用
--arg传数组,--arg仅支持单字符串传值,多值传参必须用--args配合$ARGS.positional接收
内容的提问来源于stack exchange,提问作者hoq
相关产品推荐
相关产品推荐

