2014-09-07 13 views
5

Chcę nazwać zmienną jako a_${v}.Używanie zmiennych jako części nazwy zmiennej w systemie UNIX

na przykład: v może być 2013 2014

Jestem teraz deklarowania zmiennej a_${v}

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

v=2014 

tak a_${v}=Hello # a_2014 powinna Witam

Próbowałem przy użyciu polecenia eval choć nie rzuca błąd podczas przypisywania wartości, ale nie jestem w stanie wyodrębnić wartości o nazwie zmiennej

$ v=2013 

$ eval a_${v}=Hi 


$ v=2014 

$ eval a_${v}=Hello 

echo ${a_${v}} 

nie działa .. :(

Używam bash i nie chcę, aby zmienić nazwę zmiennej tj dn't chcesz przypisać wartości do innej wartości

+0

Używasz BASH? – anubhava

+0

@ Pumbaa80 Pytanie (i jego odpowiedź), które cytujesz, jest specyficzne dla 'basha' i może być przydatne posiadanie przenośnej, nie-bash specyficznej, odpowiedzi na to pytanie. –

+0

Prosta: usuń ostatnią linię i zamiast tego wykonaj te dwie linie: 'nazwa_zmiennej = $ (echo" a _ $ {v} ")', a następnie 'echo $ {! Nazwa_zmiennej}. Nie ma za co: D Dodałbym to jako odpowiedź, ale nie pozwala mi: / – CommaToast

Odpowiedz

1

W bash można zrobić poniżej (uwaga składnię wykrzyknik w ostatnim wierszu):

#!/bin/bash 

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

ekspansja Parametr nie jest rekurencyjny, dlatego tekst ${a_${v}} jest naprawdę The contents of the variable whose name is 'a_${v}', a powłoka skarży się, że zmienna ta nazwa nie jest ważna.

Można osiągnąć rekurencyjną ekspansję za pomocą polecenia eval, jak w

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

Aby zwiększyć czytelność i łatwość konserwacji swoich skryptów powłoki, należy ograniczyć korzystanie z takich konstruktów i zawinąć je w odpowiednich struktur. Zobacz przykład rc.subr dostarczony w systemach FreeBSD.

0

W bash 4,3 także:

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 

drukuje

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 
Powiązane problemy