2011-12-08 22 views
8

Ho il seguente:Usa stringa come nome di variabile in script bash

#!/bin/sh 

n=('fred' 'bob') 

f='n' 
echo ${${f}[@]} 

e ho bisogno che la linea di fondo, dopo le sostituzioni da eseguire

echo ${n[@]} 

alcun modo per fare questo? Ho appena ricevuto

test.sh: line 8: ${${f}}: bad substitution 

sulla mia estremità.

risposta

16

Si può fare riferimento indiretto variabile con gli array come questo :

subst="$f[@]" 
echo "${!subst}" 

Come soulmerge note, non si dovrebbe usare #!/bin/sh per questo. Io uso #!/usr/bin/env bash come mio shebang, che dovrebbe funzionare indipendentemente da dove Bash si trova nel tuo percorso.

+0

Questo ha funzionato magnificamente! Grazie! – Andy

+4

+1 L'espansione indiretta è molto meno un bug magnet di 'eval'. –

5

Si potrebbe eval la riga desiderata:

eval "echo \${${f}[@]}" 

BTW: La prima linea dovrebbe essere #!/bin/bash, si sta utilizzando roba specifici bash come gli array

+0

+1 se avessi ancora voti. Puoi spiegare cosa fa l'eval? – jman

+0

eval valuta solo la stringa di parametri come un comando. – Andy

+1

Non capisco perché le persone continuino a fare downvoting senza fornire alcun feedback? – soulmerge

Problemi correlati