Estou escrevendo um script bash para usar rsync e atualizar arquivos em cerca de 20 servidores diferentes.
Eu tenho a parte rsync descoberta. O que estou tendo problemas é passar por uma lista de variáveis.
Meu script até agora está 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
Já faz muito tempo desde que eu roteirizei, então eu sei que estou perdendo alguma coisa. Além disso, tenho certeza de que estou misturando o que posso fazer usando C#, que tenho usado 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? Eu preciso fazer a mesma coisa para endereços IP de produção, bem como nomes de locais.
Isso tudo é um esforço para não ter que repetir um bloco de código que usarei para sincronizar os arquivos no servidor remoto.
Use uma matriz.
Como as outras respostas apontam, uma matriz é a maneira mais conveniente de fazer isso. No entanto, para completar, exatamente o que você está pedindo é a expansão indireta . Reescrito da seguinte forma, seu exemplo também funcionará usando este método:
Se você concordar em apenas colocar a lista de endereços IP no
for
loop, também poderá considerar simplesmente usar algumas expansões de chaves para iterar o que precisar:Mas se você precisar reutilizar a lista (possivelmente expandida por chaves), usar a lista para inicializar uma matriz seria o caminho a seguir:
Embora eu provavelmente vá com uma das respostas de matriz, gostaria de salientar que é possível fazer um loop sobre nomes diretamente. Você pode fazer
ou, na versão 4.3 e superior, você pode usar um
nameref
:Hat tip ilkkachu para a solução < 4.3.
Todo mundo que disse que você deveria usar um array está correto, mas - como um exercício acadêmico - se você estivesse determinado a fazê-lo com variáveis separadas terminando em um número (SERVER1, SERVER2, etc.), é assim que você faria isto: