我需要在远程位置执行几个复制命令(使用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”,@而不是*,引用,但我找不到可行的组合。
任何人都有这个问题的经验吗? :)
干杯, 斯文。
答案 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"