Frage

The following bash command substitution does not work as I thought.

echo $TMUX_$(echo 1)

only prints 1 and I am expecting the value of the variable $TMUX_1.I also tried:

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

Any suggestions ?

War es hilfreich?

Lösung

If I understand correctly what you're looking for, you're trying to programatically construct a variable name and then access the value of that variable. Doing this sort of thing normally requires an eval statement:

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

Important features of this statement include the use of double-quotes, so that the $( ) gets properly interpreted as a command substitution, and the escaping of the first $ so that it doesn't get evaluated the first time through. Another way to achieve the same thing is

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

where in this case I used two strings which automatically get concatenated. The first is single-quoted so that it's not evaluated at first.

There is one exception to the eval requirement: Bash has a method of indirect referencing, ${!name}, for when you want to use the contents of a variable as a variable name. You could use this as follows:

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

I'm not sure if there's a way to do it in one statement, though, since you have to have a named variable for this to work.

P.S. I'm assuming that echo 1 is just a stand-in for some more complicated command ;-)

Andere Tipps

Are you looking for arrays? Bash has them. There are a number of ways to create and use arrays in bash, the section of the bash manpage on arrays is highly recommended. Here is a sample of code:

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

The result in this case is, of course, two.

Here are a few short lines from the bash manpage:

   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.

This works (tested):

eval echo \$TMUX_`echo 1`

Probably not very clear though. Pretty sure any solutions will require backticks around the echo to get that to work.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top