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
相关产品推荐
相关产品推荐

