使用jq添加含空格的Bash字符串时失败的问题咨询
在jq中正确传递带空格的Bash变量
当Bash变量值包含空格时,直接在jq表达式中插入变量会触发语法错误,无空格时则可正常执行。
报错代码
value="value with spaces" echo {} | jq ". +={"key":"'$value'"}"
错误信息
jq: error: syntax error, unexpected $end, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1: . +={"key":"value jq: 1 compile error
期望输出
{"key":"value with spaces"}
问题原因
原代码的引号处理逻辑错误:当$value展开为带空格的字符串后,Shell会将空格作为参数分隔符,导致jq实际接收到的表达式被截断为. +={"key":"value,剩余部分被当作额外参数,从而触发语法错误。
解决方案
方法1:使用jq的--arg选项(推荐)
这是jq官方推荐的安全传递外部变量的方式,能自动处理空格、特殊字符等场景:
value="value with spaces" echo {} | jq --arg val "$value" '. += {"key": $val}'
--arg会将Bash变量$value的值传入jq,作为jq内部的变量$val使用,完全避开Shell引号的问题。
方法2:修正Shell引号拼接(不推荐,仅作参考)
如果必须通过字符串拼接传递变量,需要严格处理引号嵌套:
value="value with spaces" echo {} | jq '. += {"key": "'"$value"'"}'
这里的引号逻辑是:用单引号包裹jq表达式主体,在需要插入变量的位置,先关闭单引号、打开双引号('"),插入变量后再关闭双引号、重新打开单引号("')。但这种方式在变量包含引号、反斜杠等特殊字符时仍会出错,因此优先选择--arg方案。
内容的提问来源于stack exchange,提问作者MaxBrandtner
相关产品推荐
相关产品推荐

