Как перебрать локальный массив в удаленной команде ssh bash - PullRequest
1 голос
/ 16 июня 2011

Мне нужно выполнить несколько команд копирования в удаленном месте (используя 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"

Но даже несмотря на то, что первый эхо-сигнал печатает все три папки, эхо-запросы, выполняемые на удаленном сервере, равныпоследнее значение dir ("dir3").Я не понимаю, что я делаю неправильно, или почему он печатает три эха (и делает три копии), когда он использует только одно и то же значение.Я думаю, это как-то связано с тем, когда переменные раскрываются (локально или удаленно) ...

Я пытался использовать dirs = "dir1 dir2 dir3", @ вместо *, цитаты, но у меня нетНе удалось найти комбинацию, которая работает.

У кого-нибудь есть опыт решения этой проблемы?:)

Ура, Свенд.

1 Ответ

4 голосов
/ 16 июня 2011

Цикл for, который вы выполняете перед вызовом ssh, создает переменную $ dir, и ваша оболочка расширяет ее, поэтому вы фактически выполняете:

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

Вы должны экранировать $ дляизбегать расширения оболочки.Попробуйте:

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

В этом примере $dirs является локальной переменной, а $dir является удаленной переменной.Ваша оболочка заменит $ dirs в вашей команде ДО выполнения ssh, поэтому вы действительно выполните:

ssh user@server "for dir in dir1 dir2 dir3; do echo \$dir; cp some/file.txt /home/user/\$dir/; done"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...