我如何在远程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\"
    

要回复问题请先登录注册