2010-10-18 6 views
27

ich für das ziemlich schrecklich Titel entschuldigen - und die schlechte Qualität Post - aber was ich will im Grunde ist dies zu tun:Ist es möglich, Variablennamen aus anderen Variablen in bash zu erstellen?

for I in 1 2 3 4 
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc. 

die offensichtlich oben funktioniert nicht - es wird (glaube ich) versuchen und Echo der Variable namens $VAR$I Ist das in Bash möglich?

Antwort

33

Ja, aber tu das nicht. Verwenden Sie stattdessen ein Array.

Wenn Sie immer noch darauf, dass die Art und Weise zu tun bestehen ...

$ foo1=123 
$ bar=foo1 
$ echo "${!bar}" 
123 
+5

+1 für aber tun Sie das nicht. Verwenden Sie stattdessen ein Array. – Nifle

+0

Danke für den Rat re Arrays. Ich habe es mit Ihrem und dem Post von Pax geschafft, es zum Laufen zu bringen. Prost. – Stephen

+0

es funktioniert nicht für 'kshell' – g4ur4v

4

Sie über die Verwendung von bash Arrays für diese Art von Arbeit denken sollen:

pax> set arr=(9 8 7 6) 
pax> set idx=2 
pax> echo ${arr[!idx]} 
7 
0

Das sieht auf jeden Fall wie ein Array-Typ der Situation. Hier ist ein Link, der eine sehr nette Diskussion (mit vielen Beispielen) hat, wie Arrays in bash zu verwenden: Arrays

10
for I in 1 2 3 4 5; do 
    TMP="VAR$I" 
    echo ${!TMP} 
done 

ich eine allgemeine Regel haben, dass, wenn ich brauche indirekten Zugriff auf Variablen (dito Arrays), dann ist Zeit, das Skript von Shell in Perl/Python/etc zu konvertieren. Advanced Coding in der Shell, obwohl möglich, wird schnell ein Chaos.

4

Für den Fall, dass Sie nicht wollen, Ihre Variablen in Arrays Refactoring ...

Ein Weg ...

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done 

Eine andere Art und Weise ...

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done 

Ich habe keinen einfacheren Weg gefunden, der funktioniert. Zum Beispiel funktioniert das nicht ...

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done 
bash: ${!VAR$I}: bad substitution 
+1

Ein Teil meiner Antwort wurde zuvor von @ Dummy00001 - die einzige Person, die tatsächlich die Frage beantwortet hatte, wie gefragt. – nobar

1
+0

Es wäre schön gewesen, einen Teil der verlinkten Seite für das direkte Verständnis in Ihrer Antwort zu transkribieren ... aber solch eine großartige Referenz! –

3
for I in {1..5}; do 
    echo $((VAR$I)) 
done 
Verwandte Themen