Как использовать массив с удаленной переменной на удаленном сервере в сценариях оболочки?
Это то, что я пытаюсь сделать...
#!/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
В первой строке нужно заключить в кавычки, чтобы расширение параметров происходило на стороне сервера, а не на стороне клиента.