如何在远程ssh bash命令中迭代本地数组

时间:2011-06-16 15:36:28

标签: arrays bash ssh iteration

我需要在远程位置执行几个复制命令(使用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"

但是即使第一个echo打印了所有三个dirs,在远程服务器上执行的回声都等于最后一个dir值(“dir3”)。我不明白我做错了什么,或者为什么它只使用相同的值打印三个回声(并做三个副本)。我想这与扩展变量(本地或远程)有关...

我尝试使用dirs =“dir1 dir2 dir3”,@而不是*,引用,但我找不到可行的组合。

任何人都有这个问题的经验吗? :)

干杯,   斯文。

1 个答案:

答案 0 :(得分:4)

在调用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是远程变量。在执行ssh之前,你的shell将在你的命令中替换$ dirs,所以你将真正执行:

ssh user@server "for dir in dir1 dir2 dir3; do echo \$dir; cp some/file.txt /home/user/\$dir/; done"