Você pode passar a definição da matriz para o controle remoto bash
da seguinte forma (supondo que o shell de login do usuário remoto seja bash
):
DISKS_definition=$(typeset -p DISKS)
for i in "${HOSTS[@]}"; do
ssh "$i" "$DISKS_definition"'
for j in "${DISKS[@]}"; do
echo "$j"
done'
done
Ou se estiver usando a abordagem here-document:
DISKS_definition=$(typeset -p DISKS)
for i in "${HOSTS[@]}"; do
ssh "$i" bash <<EOF
$DISKS_definition
for j in "\${DISKS[@]}"; do
echo "\$j"
done
EOF
done
Se o seu cliente e servidor ssh
permitir a passagem de LC_*
variables, você também poderá fazer
DISKS_definition=$(typeset -p DISKS)
for i in "${HOSTS[@]}"; do
LC_DISKS=$DISKS_definition ssh "$i" bash <<'EOF'
eval "$LC_DISKS"
for j in "${DISKS[@]}"; do
echo "$j"
done
EOF
done
Tudo está na citação que determina qual dos shell local ou remoto faz as expansões. Lembre-se variáveis são expandidas dentro de aspas duplas e aqui-documentos onde o delimitador não é citado (observe o <<'EOF'
no último exemplo que impede expansões dentro do documento aqui enquanto nos exemplos anteriores (com <<EOF
) nós tivemos que usar barras invertidas para coisas que não queremos que sejam expandidas pelo shell local).
Para arrays que contenham dados não-ASCII, você deverá certificar-se de que o conjunto de caracteres do locale seja o mesmo na máquina local e remota, ou pelo menos evitar conjuntos de caracteres de múltiplos bytes diferentes de UTF-8. / p>
bash-4.3$ locale charmap
ISO-8859-1
bash-4.3$ a=($'foo\xa3$(uname>&2)bar' baz)
bash-4.3$ a_definition=$(typeset -p a)
bash-4.3$ LC_ALL=zh_HK.big5hkscs bash -c "$a_definition"
Linux
Ao mudar para um conjunto de caracteres diferente, o conteúdo de $a_definition
teve um significado diferente (fazendo com que o comando uname>&2
seja executado).