Как использовать массив с удаленной переменной на удаленном сервере в сценариях оболочки?

Это то, что я пытаюсь сделать...

#!/bin/bash

array_local=(1 2 3 4 5)

ssh user@server << EOF
index_remote=1
echo \$index_remote
echo \${array_local[\$index_remote]}  
EOF

Когда я пытаюсь запустить вышеупомянутый скрипт, я получаю O/P как 1 и нулевое значение (пробел). Я хотел, чтобы значение ${array_local[$index_remote} было 2 вместо нуля, мне нужно получить доступ к этому локальному массиву с помощью удаленной переменной для моей дальнейшей работы в сценарии.

1 ответ

Решение

<<EOF расширение переменной результатов происходит на локальной машине, но вы только определили переменную i на удаленной машине. Вы должны тщательно продумать, где вы хотите сделать расширение. Вы не объяснили в своем вопросе, является ли значение i определяется на стороне клиента или на стороне сервера, но я думаю, из ваших последующих комментариев, что вы хотите, чтобы это было сделано на стороне сервера. В этом случае вам нужно передать содержимое массива ssh, что требует тщательного цитирования:

ssh hostname@server <<EOF
i=1
eval `typeset -p array_local`
echo \${array_local[\$i]}
EOF

typeset -p array_local выведет строку

declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'

Так как это внутри обратных галочек, оно будет расширено на стороне клиента в пределах EOF-redlimited heredoc, а затем оценивается на стороне сервера eval, Другими словами это эквивалентно:

ssh hostname@server <<'EOF'
i=1
declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
echo ${array_local[$i]}
EOF

Обратите внимание на разницу в EOF цитирование между двумя примерами. Первый допускает расширение параметров и оболочки, а второй - нет. Вот почему echo В первой строке нужно заключить в кавычки, чтобы расширение параметров происходило на стороне сервера, а не на стороне клиента.

Другие вопросы по тегам