Bash循环在单台主机向变量插入特殊字符,另一主机运行正常
问题排查:NetApp LIF创建时端口参数带回车符导致失败
问题现象
脚本在一台主机上执行时,-home-port参数对应的$port变量被附加了\r回车符(调试输出显示为$'a0c-56\r'),导致NetApp返回"invalid port"错误;但相同脚本在另一台主机上运行完全正常,已对比两台主机root环境未发现明显差异。
相关脚本代码
while read -r vserverdrt lif ip mask port do echo "$vserverdrt $lif $ip $mask $port" echo ssh -n root@NETAPP net interface create -vserver $vserverdrt -lif $lif -service-policy default-data-files -address $ip -netmask $mask -home-port $port -home-node NETAPP-02 -status-admin up done < /drtest/netapp/files/vservnetdrt.txt
脚本调试输出(启用-x参数)
+ read -r vserverdrt lif ip mask port ' echo 'lebdrtestsvm1-drt LIF_lebdrtestsvm1-drt_56 10.254.56.69 255.255.255.0 a0c-56 lebdrtestsvm1-drt LIF_lebdrtestsvm1-drt_56 10.254.56.69 255.255.255.0 a0c-56 + echo + ssh -n root@NETAPP net interface create -vserver lebdrtestsvm1-drt -lif LIF_lebdrtestsvm1-drt_56 -service-policy default-data-files -address 10.254.56.69 -netmask 255.255.255.0 -home-port $'a0c-56\r' -home-node NETAPP-02 -status-admin up Last login time: 1/17/2025 15:38:10 (network interface create) is an invalid port on node NETAPP-02.
排查方向
- 检查输入文件格式:执行
cat -A /drtest/netapp/files/vservnetdrt.txt,查看每行结尾是否有^M(对应Windows CRLF换行符)。问题主机的输入文件大概率是Windows格式,而正常主机是Unix LF格式。 - 对比bash版本:两台主机执行
bash --version,确认bash版本是否一致,不同版本对read命令处理换行符的逻辑可能存在差异。 - 验证IFS环境变量:执行
echo "$IFS" | cat -A,检查是否包含\r或其他异常分隔符,这会影响read命令的字段拆分行为。 - 临时转换文件格式:用
dos2unix /drtest/netapp/files/vservnetdrt.txt将文件转为Unix格式后重新执行脚本,验证是否解决问题。 - 脚本内添加字符清理:在使用
$port前添加port=${port%$'\r'},强制移除末尾的回车符,绕过环境差异导致的问题。
内容的提问来源于stack exchange,提问作者Bob Moore
相关产品推荐
相关产品推荐

