expansión del comando de bash
-
28-10-2019 - |
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 ?
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.