bash + como definir a variável do array com o número da instância

1

É possível definir a variável que é chamada por exemplo machine1 como machine $ counter (while counter = 1)?

Por exemplo, criei o arquivo /tmp/config.txt e configurei a máquina1 como matriz:

 $ more /tmp/config.txt
 machine1=( linux_server critical 1.1.1.1 )
 machine2=( linux_server critical 1.1.1.2 )
 .
 .

Então criei o seguinte script simples para ler o /tmp/config.txt . E tento imprimir o array de máquinas da seguinte forma:

 $ more read.config.bash
 #!/bin/bash

 source /tmp/config.txt
 counter=1
 echo ${machine$counter[0]}
 echo ${machine$counter[1]}
 echo ${machine$counter[2]}
 .
 .

Mas quando eu executo o script, recebo:

$ ./read.config.bash
./read.config.bash: line 6: ${machine$counter[0]}: bad substitution
./read.config.bash: line 7: ${machine$counter[1]}: bad substitution
./read.config.bash: line 8: ${machine$counter[2]}: bad substitution

Qual é a solução para este problema?

    
por maihabunash 18.05.2015 / 16:07

2 respostas

1

Use o comando eval .

eval "echo \${machine${counter[0]}}"

Observe que o primeiro $ é escapado para que não seja avaliado até que eval processe a string.

A maneira como isso funciona é que eval executa um comando da mesma forma como se você tivesse digitado no prompt de comando. A diferença é que o comando que é executado pode ser construído programaticamente.

Portanto, no seu cenário, quando eval é executado no comando, o comando que está em execução na verdade é semelhante a: echo ${machineBLAH} . A substituição de variável interna já foi executada separadamente pelo shell antes eval é executado.

Para obter mais informações, consulte esta outra postagem: Qual é o comando "eval" no bash? .

    
por 18.05.2015 / 16:30
1

Você pode evitar usar eval

source /tmp/config.txt
counter=1
line0="machine$counter[0]"
echo ${!line}

E muito melhor chamar echo via loop

for counter in 1 2 3
do
    line="machine$counter[@]"
    for element in "${!line}"
    do
        echo $element
    done
done
    
por 18.05.2015 / 17:40