expansion de la commande bash
-
28-10-2019 - |
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?
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.