Bash环境下SSH远程执行命令时变量展开失效问题求助
解决SSH命令中本地变量无法展开的问题
这个问题的核心原因很直白:shell里的单引号会完全阻止变量替换——你用单引号把远程命令包起来后,$act_url会被当作字面量传到远程服务器,远程服务器会去查找它自己环境里的act_url变量,而不是你本地定义的那个。
给你两种靠谱的解决办法:
方法1:改用双引号包裹远程命令(注意转义内部引号)
把外层的单引号换成双引号,同时转义命令里的双引号,这样本地shell会先展开$act_url,再把完整的命令传给远程:
act_url="https://someurl" url=$(ssh user@xx.xx.xx.xx "somecommand \"$act_url\"") echo $url
另外建议用$()代替反引号(`)来捕获命令输出,可读性更好,也避免了嵌套时的转义问题。
方法2:拆分单引号拼接变量
如果不想改外层引号,可以把变量部分从单引号里拆出来,用双引号包裹变量,再和单引号部分拼接:
act_url="https://someurl" url=$(ssh user@xx.xx.xx.xx 'somecommand "'"$act_url"'"') echo $url
这里的拼接逻辑是:'somecommand "' 是单引号包裹的固定字符串,接着"$act_url"展开本地变量,最后'"'补上结尾的双引号,组合起来就是远程执行的somecommand "https://someurl"。
内容的提问来源于stack exchange,提问作者Santhosh
相关产品推荐
相关产品推荐

