远程SSH执行脚本:grep匹配失败时无返回值输出问题咨询
问题分析与解决方案
让我帮你拆解下问题——你的脚本确实存在语法问题,这就是为什么vhost不存在时没有输出的核心原因。
问题根源
你写的命令行没有用分号或换行来分隔独立的命令,导致远程Shell无法正确解析你要执行的三个操作:
(sudo rabbitmqctl list_vhosts -q | grep $RABBITMQ_BATCH_VHOST ) RESULT=$? echo $RESULT
这段代码会被Shell误解为:运行子shell (sudo ...),然后把RESULT=$?和echo $RESULT当成这个子shell命令的参数,完全偏离了你原本的逻辑。
当vhost存在时,grep会输出匹配内容,子shell正常退出,可能此时Shell的错误处理机制让echo偶然执行了;但当vhost不存在时,grep返回非0状态,加上语法错误,整个命令执行失败,自然没有任何输出。
修正后的写法
方式1:直接在SSH命令中修正语法
用分号分隔命令,并且用单引号包裹整个远程命令(避免本地Shell提前展开变量):
ssh your_remote_host 'sudo rabbitmqctl list_vhosts -q | grep "$RABBITMQ_BATCH_VHOST"; RESULT=$?; echo $RESULT'
方式2:写成独立脚本执行
如果是上传脚本到远程主机后执行,脚本内容应该是:
#!/bin/bash # 检查vhost是否存在并输出状态码 sudo rabbitmqctl list_vhosts -q | grep "$RABBITMQ_BATCH_VHOST" RESULT=$? echo $RESULT
然后通过SSH执行:
ssh your_remote_host 'bash /path/to/your/check_vhost.sh'
简化版逻辑
其实你可以省略中间变量RESULT,直接输出grep的退出状态,用-q参数让grep静默运行(只返回状态不输出匹配内容):
ssh your_remote_host 'sudo rabbitmqctl list_vhosts -q | grep -q "$RABBITMQ_BATCH_VHOST"; echo $?'
这样更简洁,输出的0表示vhost存在,非0值表示不存在。
内容的提问来源于stack exchange,提问作者Zaks
相关产品推荐
相关产品推荐

