bash + cómo definir la variable de matriz con el número de instancia

¿Es posible definir una variable llamada, por ejemplo, machine1 como machine $ counter (while counter = 1)?

Por ejemplo, creé el file /tmp/config.txt y configuré el machine1 como una matriz:

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

Luego, creé el siguiente script simple para leer el /tmp/config.txt . Y trato de imprimir la matriz de máquinas de la siguiente manera:

  $ more read.config.bash #!/bin/bash source /tmp/config.txt counter=1 echo ${machine$counter[0]} echo ${machine$counter[1]} echo ${machine$counter[2]} . . 

Pero cuando ejecuto el script, obtengo:

 $ ./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 

¿Cuál es la solución para este problema?

Usa el command eval

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

Tenga en count que los primeros $ se escapan para que no se evalúen hasta que eval procese la cadena.

La forma en que esto funciona es que eval ejecuta un command del mismo modo que si lo hubiera escrito en el símbolo del sistema. La diferencia es que el command que se ejecuta se puede build programáticamente.

Entonces, en su escenario, cuando eval ejecuta en el command, el command que está ejecutando se ve así: echo ${machineBLAH} . La sustitución de la variable interna ya se ha realizado por separado por el shell antes de ejecutar eval .

Para get más información, consulte esta otra publicación: ¿Qué es el command "eval" en bash? .

Puede evitar el uso de eval

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

Y mucho mejor llamar echo través de bucle

 for counter in 1 2 3 do line="machine$counter[@]" for element in "${!line}" do echo $element done done