Pregunta

La siguiente sustitución del comando bash no funciona como pensaba.

echo $TMUX_$(echo 1)

Solo imprime 1 y espero el valor de la variable $TMUX_1. También probé:

echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution

Alguna sugerencia ?

¿Fue útil?

Solución

Si entiendo correctamente lo que está buscando, está tratando de construir programáticamente un nombre de variable y luego acceder al valor de esa variable. Hacer este tipo de cosas normalmente requiere un eval declaración:

eval "echo \$TMUX_$(echo 1)"

Las características importantes de esta afirmación incluyen el uso de quotas dobles, de modo que el $( ) se interpreta adecuadamente como una sustitución de comandos y la escapada del primero $ para que no se evalúe la primera vez. Otra forma de lograr lo mismo es

eval 'echo $TMUX_'"$(echo 1)"

donde en este caso utilicé dos cadenas que se concatenan automáticamente. El primero es citada única para que no se evalúe al principio.

Hay una excepción al eval Requisito: Bash tiene un método de referencia indirecta, ${!name}, para cuando desea usar el contenido de una variable como nombre de variable. Podrías usar esto de la siguiente manera:

tmux_var = "TMUX_$(echo 1)"
echo ${!tmux_var}

Sin embargo, no estoy seguro de si hay una manera de hacerlo en una declaración, ya que debe tener una variable nombrada para que esto funcione.

PD, supongo que eso echo 1 es solo un sustituto de un comando más complicado ;-)

Otros consejos

¿Estás buscando matrices? Bash los tiene. Hay varias formas de crear y usar matrices en Bash, se recomienda muy recomendable la sección de Bash Manpage en matrices. Aquí hay una muestra de código:

TMUX=( "zero", "one", "two" )
echo ${TMUX[2]}

El resultado en este caso es, por supuesto, dos.

Aquí hay unas pocas líneas cortas de la mano de manejo de Bash:

   Bash provides one-dimensional indexed and associative array variables.  Any variable may be
   used  as  an indexed array; the declare builtin will explicitly declare an array.  There is
   no maximum limit on the size of an array, nor any requirement that members  be  indexed  or
   assigned  contiguously.  Indexed arrays are referenced using integers (including arithmetic
   expressions)  and  are  zero-based;  associative  arrays  are  referenced  using  arbitrary
   strings.

   An  indexed  array is created automatically if any variable is assigned to using the syntax
   name[subscript]=value.  The subscript is treated as  an  arithmetic  expression  that  must
   evaluate  to  a  number  greater  than  or equal to zero.  To explicitly declare an indexed
   array, use declare -a name (see SHELL BUILTIN COMMANDS below).  declare -a  name[subscript]
   is also accepted; the subscript is ignored.

Esto funciona (probado):

eval echo \$TMUX_`echo 1`

Probablemente no sea muy claro. Está bastante seguro de que cualquier solución requerirá retroceso alrededor del Echo para que eso funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top