Bash脚本字符串匹配异常:IP相等却进入else分支
问题原因
hostname -I的输出通常包含**多个IP地址(空格分隔)**或者末尾带有隐藏的换行/空格字符,导致ipaddr变量的实际内容和你看到的不一样——表面和prodip相同,但实际字符串并不相等,所以脚本会进入else分支。
验证方法
可以通过以下命令查看ipaddr的真实内容,确认是否存在隐藏字符:
# 查看所有字符(包括不可见字符) echo "$ipaddr" | od -c # 对比两个变量的字符串长度 echo "${#ipaddr}" echo "${#prodip}"
prodip的长度是13,而ipaddr的长度会更长(因为包含空格或换行)。
解决方案
方法1:提取hostname -I输出的第一个IP地址
修改ipaddr的赋值语句,用awk只取输出中的第一个IP:
ipaddr=$(hostname -I | awk '{print $1}')
方法2:使用更可靠的单IP获取命令
如果系统支持,用hostname -i(小写i)替代hostname -I,它通常只输出单个IP:
ipaddr=$(hostname -i)
方法3:用ip命令精准过滤(推荐)
如果上述方法兼容性不好,可以用ip命令指定网卡提取IP,比如你的网卡是eth0:
ipaddr=$(ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
把eth0换成你实际使用的网卡名称(可用ip link查看所有网卡)。
额外提示
Shell中字符串比较的标准写法是用=而非==(bash兼容==,但POSIX标准是=),修改if条件更规范:
if [ "$ipaddr" = "$prodip" ]; then
内容的提问来源于stack exchange,提问作者James Finnegan
相关产品推荐
相关产品推荐

