Bash脚本if判断失效排查:变量值正确但判断不匹配
解决Bash脚本中SSH返回值匹配失败的问题
你的问题出在ssh命令使用了-t选项,这个选项会强制在远程端分配伪终端(PTY),导致返回的BOBCHECK变量中包含不可见的控制字符(比如回车符\r)或者多余的空白字符——虽然echo输出看起来是"found"或"missing",但实际字符串和你判断的字面量并不完全一致,所以if分支始终不匹配。
验证问题
可以在echo "$BOBCHECK"后添加一行命令,查看变量的实际字符内容:
echo "$BOBCHECK" | od -c
如果输出里出现\r(回车符)或者其他非可见字符,就说明是这个问题。
解决方案
方案1:移除-t选项(推荐)
你这里只是执行非交互式的远程命令,不需要分配伪终端,直接去掉-t即可:
#!/bin/bash for hn in $(cat /root/scripts/linux/linhosts.lst); do echo "" && echo "Checking for bob user on $hn" BOBCHECK=$( ssh -oStrictHostKeyChecking=no "$hn" 'if getent passwd bob > /dev/null 2>&1; then echo "found"; else echo "missing"; fi' ) echo "$BOBCHECK" if [ "$BOBCHECK" = "found" ]; then echo "exist check complete, user found" elif [ "$BOBCHECK" = "missing" ]; then echo "exist check complete, user not there" else echo "exist check failed" fi done
方案2:保留-t但清理输出
如果因为某些场景必须使用-t,可以对SSH返回的结果做字符清理,去掉多余的控制字符和空白:
#!/bin/bash for hn in $(cat /root/scripts/linux/linhosts.lst); do echo "" && echo "Checking for bob user on $hn" # 用tr去掉回车符,xargs去除首尾空白和多余换行 BOBCHECK=$( ssh -t -oStrictHostKeyChecking=no "$hn" 'if getent passwd bob > /dev/null 2>&1; then echo "found"; else echo "missing"; fi' | tr -d '\r' | xargs ) echo "$BOBCHECK" if [ "$BOBCHECK" = "found" ]; then echo "exist check complete, user found" elif [ "$BOBCHECK" = "missing" ]; then echo "exist check complete, user not there" else echo "exist check failed" fi done
补充说明
ssh -t主要用于需要交互式终端的场景(比如远程执行需要输入密码的命令、或者使用vim等交互式工具),普通的非交互式命令完全不需要这个选项,反而会引入不必要的终端控制字符干扰输出。
内容的提问来源于stack exchange,提问作者Atalon
相关产品推荐
相关产品推荐

