2014-09-07 14 views
5

Desidero denominare variabile come a_${v}.Utilizzo delle variabili come parte del nome della variabile in unix

ad esempio: v può essere 2013 2014

ora sto dichiarando una variabile per a_${v}

a_${v}=hI # a_2013 should be Hi 

v=2014 

così a_${v}=Hello # a_2014 dovrebbe essere Ciao

Ho provato ad utilizzare il comando eval anche se non è buttare errore durante l'assegnazione di un valore ma non sono in grado di estrarre il valore della variabile nome

$ v=2013 

$ eval a_${v}=Hi 


$ v=2014 

$ eval a_${v}=Hello 

echo ${a_${v}} 

non funziona .. :(

Sto usando bash e io non voglio cambiare la variabile nome cioè dn't vuole assegnare il valore ad un altro valore

+0

Si sta utilizzando BASH? – anubhava

+0

@ Pumbaa80 La domanda (e la sua risposta) che citi è specifica di 'bash' e può essere utile avere una risposta portatile, non bash specifica, a questa domanda. –

+0

Semplice: rimuovi l'ultima riga e invece esegui queste due righe: 'varname = $ (echo" a _ $ {v} ")' seguito da 'echo $ {! Varname}'. Prego: D Aggiungerei questa risposta ma non mi consente: / – CommaToast

risposta

1

In bash si può fare la sotto (notare la sintassi punto esclamativo nell'ultima riga):

#!/bin/bash 

a_2014='hello 2014' 
year=2014 
varname=a_${year} 
echo ${!varname} 
0

espansione parametro non è ricorsiva, quindi, il testo ${a_${v}} è davvero The contents of the variable whose name is 'a_${v}', e il guscio si lamenta che questo nome di variabile non è valido.

È possibile ottenere l'espansione ricorsiva con il comando eval, come in

eval printf '%s\n' "\${a_${v}}" 

Per aumentare la leggibilità e la manutenibilità degli script di shell, si dovrebbe limitare l'uso di tali costrutti e avvolgerli in strutture adeguate. Vedere rc.subr fornito su sistemi FreeBSD per un esempio.

0

In bash 4.3 anche:

txt="Value of the variable" 

show() { echo "indirect access to $1: ${!1}"; } 

a_2014='value of a_2014' 
echo "$txt \$a_2014: $a_2014" 
show a_2014     # <-------- this -----------------------+ 
           #          | 
prefix=a      #          | 
year=2014      #          | 
string="${prefix}_${year}"  #          | 
echo "\$string: $string"  #          | 
show "$string"   #$string contains a_2014 e.g. the same as ---+ 

echo ===4.3==== 
#declare -n - only in bash 4.3 
#declare -n refvar=${prefix}_${year} 
#or 
declare -n refvar=${string} 

echo "$txt \$refvar: $refvar" 
show refvar 

echo "==assign to refvar==" 
refvar="another hello 2014" 
echo "$txt \$refvar: $refvar" 
echo "$txt \$a_2014: $a_2014" 
show a_2014 
show "$string" #same as above 
show refvar 

stampe

Value of the variable $a_2014: value of a_2014 
indirect access to a_2014: value of a_2014 
$string: a_2014 
indirect access to a_2014: value of a_2014 
===4.3==== 
Value of the variable $refvar: value of a_2014 
indirect access to refvar: value of a_2014 
==assign to refvar== 
Value of the variable $refvar: another hello 2014 
Value of the variable $a_2014: another hello 2014 
indirect access to a_2014: another hello 2014 
indirect access to a_2014: another hello 2014 
indirect access to refvar: another hello 2014 
Problemi correlati