JQ处理Curl请求输出:多结果单行打印与带空格值拆分异常
解决JQ输出空格拆分问题
根本原因
你使用echo $(...)的写法时,bash会将命令输出里的换行、空格全部视为字段分隔符,导致带空格的"Google Servers"被拆成两个独立字段,错误分配给var3和var4。
解决方案
方案1:用JQ输出Shell安全格式,配合read读取
让JQ自动为带空格的字段添加引号,确保bash读取时不会拆分:
read var1 var2 var3 var4 < <(curl -s "https://example.com/api/json/APIKEY/$ip" | jq -r '@sh "\(.proxy) \(.vpn) \(.ISP) \(.timezone)"')
-r:输出原始字符串(不带转义引号)@sh:自动为含空格/特殊字符的字段包裹单引号,符合Shell语法规范
方案2:用JQ输出CSV格式,按逗号分隔读取
如果字段不含逗号,这个方法更稳妥:
IFS=, read var1 var2 var3 var4 < <(curl -s "https://example.com/api/json/APIKEY/$ip" | jq -r '[.proxy,.vpn,.ISP,.timezone] | @csv')
[.proxy,.vpn,.ISP,.timezone]:将目标字段打包成JSON数组@csv:把数组转为CSV格式,带空格的字段会被双引号包裹IFS=,:指定read用逗号作为字段分隔符
方案3:让JQ输出单行无格式结果
如果不需要引号,直接让JQ输出紧凑单行内容:
read var1 var2 var3 var4 < <(curl -s "https://example.com/api/json/APIKEY/$ip" | jq -c '[.proxy,.vpn,.ISP,.timezone]' | tr -d '[]"')
-c:输出紧凑JSON数组(如[true,true,"Google Servers","America/Los_Angeles"])tr -d '[]"':移除数组的括号和引号,得到空格分隔的纯文本
验证方式
赋值完成后,直接打印变量即可确认结果:
echo "var1: $var1" echo "var2: $var2" echo "var3: $var3" echo "var4: $var4"
此时var3会完整显示Google Servers,不会被拆分。
内容的提问来源于stack exchange,提问作者user20342916
相关产品推荐
相关产品推荐

