Question

La substitution de commande bash suivante ne fonctionne pas comme je le pensais.

echo $TMUX_$(echo 1)

n'imprime que 1 et j'attends la valeur de la variable $TMUX_1.J'ai aussi essayé:

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

Des suggestions?

Était-ce utile?

La solution

Si je comprends bien ce que vous recherchez, vous essayez de construire par programme un nom de variable, puis d'accéder à la valeur de cette variable. Faire ce genre de chose nécessite normalement une instruction eval:

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

Les caractéristiques importantes de cette instruction incluent l'utilisation de guillemets doubles, afin que le $( ) soit correctement interprété comme une substitution de commande, et l'échappement du premier $ afin qu'il ne soit pas évalué la première fois.

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

où dans ce cas j'ai utilisé deux chaînes qui sont automatiquement concaténées. Le premier est entre guillemets simples pour ne pas être évalué au début.

Il y a une exception à l'exigence eval: Bash a une méthode de référencement indirect, ${!name}, lorsque vous voulez utiliser le contenu d'une variable comme nom de variable. Vous pouvez l'utiliser comme suit:

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

Je ne sais pas s'il existe un moyen de le faire dans une seule instruction, car vous devez avoir une variable nommée pour que cela fonctionne.

P.S. Je suppose que echo 1 est juste un substitut pour une commande plus compliquée ;-)

Autres conseils

Recherchez-vous des tableaux?Bash les a.Il existe un certain nombre de façons de créer et d'utiliser des tableaux dans bash, la section de la page de manuel bash sur les tableaux est fortement recommandée.Voici un exemple de code:

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

Le résultat dans ce cas est, bien sûr, deux.

Voici quelques courtes lignes de la page de manuel 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.

Cela fonctionne (testé):

eval echo \$TMUX_`echo 1`

Probablement pas très clair cependant.À peu près sûr, toutes les solutions nécessiteront des backticks autour de l'écho pour que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top