bash
4.3 добавил поддержку ksh93
-подобных namerefs.
Поэтому в bash-4.3 и выше вы можете сделать:
a0[5]=whatever
x=0
typeset -n var="a$x"
printf '%s\n' "${var[5]}"
Но обратите внимание, что это ссылка (указатель, а не копия) на переменную name, а не сама переменная (разница имеет значение, когда у вас есть несколько переменных с одним и тем же именем в разных контекстах, как для локальных переменных в функциях).
bash
скопировал ksh
массивы с их неудобным дизайном. Сделать копию массива в bash
сложно, вы можете использовать вспомогательную функцию типа:
copy_array() { # Args: <src_array_name> <dst_array_name>
eval '
local i
'"$2"'=()
for i in "${!'"$1"'[@]}"; do
'"$2"'[$i]=${'"$1"'[$i]}
done'
}
Для использования, например, как:
$ a0[5]=123
$ x=0
$ copy_array "a$x" var
$ typeset -p var
declare -a var=([5]="123")
ksh
(и bash
, который копирует ksh
) - единственная оболочка, где массивы являются разреженными (или являются ассоциативными массивами, ключи которых ограничены целыми положительными числами) (также единственные массивы с индексами, начинающимися с 0, а не с 1, или где $array
неинтуитивно расширяется не до элементов, а до элемента с индексом 0). С другими оболочками все гораздо проще.
rc
: array_copy = $array
fish
: set array_copy = $array
csh
: set array_copy = ($array:q)
zsh
или yash
: array_copy=("${array[@]}"}
Для косвенного копирования (где $var
содержит имя исходного массива):
rc
: eval array_copy = '$'$var
fish
: eval set array_copy \$$var
csh
: eval "set array_copy = (\$$${var}:q)"
zsh
: array_copy=("${(@P)var}")
yash
(or zsh
): eval 'array_copy=("${'"$var"'[@]}")'
Все решения требуют некоторой предварительной настройки (поскольку по умолчанию между независимыми системами нет доверительных отношений - если бы они были, это было бы серьезной проблемой безопасности).
Вы можете добавить свой открытый ключ в процесс предоставления/установки новых серверов, вы можете добавить ключи центра сертификации, которые будут доверенными, как указано @UlrichSchwarz, или вы можете присоединиться к ним в домене Kerberos и аутентифицироваться с помощью билетов kerberos.
Возможностей много, но из коробки ничего вам не подойдет.
Прочитав ваш вопрос в третий раз, я больше не уверен, что правильно понял ваш вопрос. Возможно, вы просто ищете переадресацию ssh-agent
? Если нет, уточните.