Estou escrevendo um script bash para usar o rsync e atualizar arquivos em cerca de 20 servidores diferentes.
Eu tenho a parte do rsync descoberta. O que eu estou tendo problemas é através de uma lista de variáveis.
Até agora, meu script é assim:
#!/bin/bash
SERVER1="192.xxx.xxx.2"
SERVER2="192.xxx.xxx.3"
SERVER3="192.xxx.xxx.4"
SERVER4="192.xxx.xxx.5"
SERVER5="192.xxx.xxx.6"
SERVER6="192.xxx.xxx.7"
for ((i=1; i<7; i++))
do
echo [Server IP Address]
done
Onde [Server IP Address]
deve ser o valor da variável associada. Então, quando i = 1, devo ecoar o valor de $ SERVER1.
Eu tentei várias iterações disso, incluindo
echo "$SERVER$i" # printed the value of i
echo "SERVER$i" # printer "SERVER" plus the value of i ex: SERVER 1 where i = 1
echo $("SERVER$i") # produced an error SERVER1: command not found where i = 1
echo $$SERVER$i # printed a four digit number followed by "SERVER" plus the value of i
echo \$$SERVER$i # printed "$" plus the value of i
Faz muito tempo desde que eu escrevi o script, então sei que estou perdendo alguma coisa. Além disso, tenho certeza de que estou misturando o que poderia fazer usando C #, que usei nos últimos 11 anos.
O que estou tentando fazer é possível? Ou devo colocar esses valores em uma matriz e fazer um loop pela matriz? Preciso fazer o mesmo para endereços IP de produção e nomes de locais.
Tudo isso é um esforço para não precisar repetir um bloco de código que usarei para sincronizar os arquivos no servidor remoto.
fonte
Respostas:
Use uma matriz.
fonte
Como as outras respostas apontam, uma matriz é a maneira mais conveniente de fazer isso. No entanto, para ser completo, o que você está pedindo é a expansão indireta . Reescrito da seguinte forma, sua amostra também funcionará usando este método:
Se você concorda em colocar a lista de endereços IP no
for
loop, considere também o uso de algumas expansões de chaves para iterar o que você precisar:Mas se você precisar reutilizar a lista (possivelmente entre chaves), usar a lista para inicializar uma matriz seria o caminho a seguir:
fonte
Embora eu provavelmente deva responder uma das respostas da matriz, gostaria de salientar que é possível repetir nomes diretamente. Você pode fazer
ou, nas versões 4.3 e superior, você pode usar um
nameref
:Gorro de ilkkachu para a solução <4,3.
fonte
${!var}
) funciona com versões mais antigas do Bash também:foo1=aa; foo2=bbb; foox=cccc; for p in "${!foo@}"; do echo "$p = ${!p}"; done
Todos que disseram que você deveria usar uma matriz estão corretos, mas - como exercício acadêmico - se você estivesse determinado a fazê-lo com variáveis separadas que terminam em um número (SERVER1, SERVER2, etc.), é assim que você faria isto:
fonte
eval
é difícil de usar com segurança. Sim, isso pode funcionar, mas bash expansão indireta é uma maneira melhor em geral.eval
terminar, vocêecho $SERVER1
não conseguiuecho "$SERVER1"
. Sim, é possível usar com segurança, mas é muito fácil de usar de maneira insegura ou não, como você pretendia!