Espansione del comando Bash
-
28-10-2019 - |
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 ?
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.