You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jq输出字符串长度异常 无法与服务器hostname变量匹配问题求助

问题解决方法

第一步:定位多余字符类型

你观察到的字符串长度比实际多1,且普通空格裁剪无效,说明多余的是不可见特殊字符,执行以下代码即可查看字符的具体编码:

# 打印转义后的原始字符串,直接显示特殊字符标记
printf "hostname 原始字符:%q\n" "$hostname"
# 输出十六进制编码进一步确认类型
printf '%s' "$hostname" | hexdump -C

最常见的两类多余字符:Windows格式换行带来的回车符\r、JSON字符串中隐含的零宽空格类字符。

你之前使用的${hostname##*( )}裁剪无效,原因是该语法需要先开启extglob选项(shopt -s extglob)才会生效,且只能移除开头的普通空格,对回车、零宽空格等其他不可见字符没有效果。

第二步:针对性修复

修复jq调用逻辑

你当前的jq命令加了不必要的@text修饰,-r参数已经可以直接输出字段的原始字符串,先修改jq调用命令:

done < <(jq -r '.[] | .id, .serverinfos.hostname' "$jsonlist")

如果调整后还是存在多余字符,读取变量时直接清理所有非法字符即可:

while read -r id
do      
    read -r raw_hostname
    # 只保留主机名允许的字母、数字、._-三类符号,过滤所有其他字符
    hostname=$(tr -cd '[:alnum:]_.-' <<< "$raw_hostname")
    # 剩余业务逻辑不变

如果确认是回车符\r导致的问题,也可以针对性删除:

hostname=${raw_hostname%$'\r'}

修复数组遍历语法错误

该语法错误是非常常见的匹配失败原因,建议优先修正后测试
你当前遍历serverlist数组的写法是错误的:for server in "$serverlist"只会把整个数组当做单个字符串处理,仅会遍历一次,正确的数组遍历写法应该是:

for server in "${serverlist[@]}"

内容的提问来源于stack exchange,提问作者flow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:15:11