Domanda

La seguente sostituzione del comando bash non funziona come pensavo.

echo $TMUX_$(echo 1)

Stampa solo 1 e mi aspetto il valore della variabile $TMUX_1. Ho anche provato:

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

Eventuali suggerimenti ?

È stato utile?

Soluzione

Se ho capito correttamente cosa stai cercando, stai cercando di costruire un nome variabile e quindi accedere al valore di quella variabile. Fare questo genere di cose normalmente richiede un eval dichiarazione:

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

Le caratteristiche importanti di questa affermazione includono l'uso di doppie quote, in modo che il $( ) viene interpretato correttamente come una sostituzione del comando e la fuga del primo $ in modo che non venga valutato la prima volta. Un altro modo per raggiungere la stessa cosa è

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

dove in questo caso ho usato due stringhe che vengono automaticamente concatenate. Il primo è singolo in modo che all'inizio non venga valutato.

C'è un'eccezione al eval Requisito: Bash ha un metodo di riferimento indiretto, ${!name}, per quando si desidera utilizzare il contenuto di una variabile come nome variabile. Potresti usarlo come segue:

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

Non sono sicuro se ci sia un modo per farlo in una dichiarazione, poiché devi avere una variabile denominata affinché questo funzioni.

PS lo sto assumendo echo 1 è solo un stand-in per qualche comando più complicato ;-)

Altri suggerimenti

Stai cercando array? Bash li ha. Esistono diversi modi per creare e utilizzare array in Bash, è altamente raccomandata la sezione della mannala bash su array. Ecco un esempio di codice:

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

Il risultato in questo caso è, ovviamente, due.

Ecco alcune brevi linee della mano di 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.

Questo funziona (testato):

eval echo \$TMUX_`echo 1`

Probabilmente non è molto chiaro però. Abbastanza sicuro che tutte le soluzioni richiederanno backtick intorno all'eco per farlo funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top