Shell脚本remote_file变量值判断异常问题求助
解决SSH远程命令输出判断失效的问题
这个问题大概率是ssh -t参数引入的隐藏控制字符在搞鬼!我来给你拆解清楚:
问题根源
你用了-t参数强制SSH分配伪终端,这个参数本来是给交互式命令(比如vim、top这类需要终端环境的程序)准备的,但对于你这种简单的文件检查命令,它反而会悄悄加入多余的终端控制字符(比如回车符\r、换行符\n,甚至终端转义序列)。这些字符肉眼看不到,但会让remote_file变量的实际内容不是纯粹的exists或nonexistant,自然导致你的条件判断永远不匹配。
快速解决方案
方案1:去掉不必要的-t参数
既然你的远程命令是非交互式的,完全不需要伪终端,直接删掉-t就行:
remote_file=$(ssh -o LogLevel=QUIET "$ip_address" 'if [[ -f ~/logs/output.log ]]; then echo exists; else echo nonexistant; fi')
修改后再执行if [[ "x$remote_file" == "xexists" ]],应该就能正常匹配了。
方案2:如果必须保留-t,清理输出内容
如果因为特殊需求(比如远程主机的命令依赖终端环境)必须用-t,那就要把输出里的多余字符过滤掉:
- 用
tr去掉所有回车和换行:
remote_file=$(ssh -t -o LogLevel=QUIET "$ip_address" 'if [[ -f ~/logs/output.log ]]; then echo exists; else echo nonexistant; fi' | tr -d '\r\n')
- 或者在远程命令里用
printf代替echo(printf默认不会自动添加换行符):
remote_file=$(ssh -t -o LogLevel=QUIET "$ip_address" 'if [[ -f ~/logs/output.log ]]; then printf exists; else printf nonexistant; fi')
排查验证方法
你可以用下面的命令查看remote_file里的真实内容,确认是不是有隐藏字符:
echo "$remote_file" | cat -A # 或者用od命令查看字符编码细节 echo "$remote_file" | od -c
如果输出里有$(换行符标记)或者^M(回车符),就坐实了是额外字符导致的判断失效。
内容的提问来源于stack exchange,提问作者vijayanand
相关产品推荐
相关产品推荐

