如何解决我如何在远程ssh bash命令中遍历本地数组
|| 我需要在远程位置上执行几个复制命令(使用ssh \“ cp blah blah2 \”)。我不想为每个命令使用单独的ssh连接,而是要执行以下操作:dirs=(dir1 dir2 dir3)
for dir in ${dirs[*]} ; do echo $dir; done
ssh user@server \"for dir in ${dirs[*]}; do echo $dir; cp some/file.txt /home/user/$dir/; done\"
但是,即使第一个回显打印了所有三个目录,但在远程服务器上执行的回显都等于最后一个目录值(\“ dir3 \”)。我不明白自己在做错什么,或者为什么当它仅使用相同的值时却打印三个回显(并执行三个副本)。我想这与变量扩展(本地或远程)有关。
我已经尝试使用dirs = \“ dir1 dir2 dir3 \”,@而不是*,但是我无法找到有效的组合。
任何人有这个问题的经验吗? :)
干杯,
斯文德
解决方法
您在调用ssh之前执行的
for
循环会创建$ dir变量,并且您的shell会对其进行扩展,因此您实际上是在执行:
ssh user@server \"for dir in dir1 dir2 dir3; do echo dir3; cp some/file.txt /home/user/dir3/; done\"
您应该转义$以避免shell扩展。尝试:
dirs=\"dir1 dir2 dir3\"
ssh user@server \"for dir in $dirs ; do echo \\$dir; cp some/file.txt /home/user/\\$dir/; done\"
在此示例中,$dirs
是局部变量,$dir
是远程变量。您的shell将在执行ssh之前替换命令中的$ dirs,因此您将真正执行:
ssh user@server \"for dir in dir1 dir2 dir3; do echo \\$dir; cp some/file.txt /home/user/\\$dir/; done\"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。