2012-06-12 12 views
9

Mam skrypt basha Mam pewne problemy z łączeniem 2 zmiennych, aby wywołać 3rd.Bash, Łączenie 2 łańcuchów w celu odniesienia do 3. zmiennej

Oto uproszczenie skryptu, ale składnia omija mnie po przeczytaniu dokumentów.

server_list_all="server1 server2 server3"; 
var1 = "server"; 
var2 = "all"; 

echo $(($var1_list_$var2)); 

To jest tak blisko, jak tylko dostaję się do właściwej odpowiedzi, potwierdza ciąg i rzuca błąd na tokenizację.

syntax error in expression (error token is "server1 server2 server3.... 

naprawdę nie widząc nic w docs dla tego, ale powinno być wykonalne.

EDIT: oczyścić nieco

+2

Zobacz [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). –

Odpowiedz

20

The Bash Reference Manual explains how you can use a neat feature of parameter expansion zrobić jakieś zadnie. W twoim przypadku, jesteś zainteresowany znalezieniem zawartość zmiennej, której nazwa jest określona przez dwóch innych zmiennych:

server_list_all="server1 server2 server3" 
var1=server 
var2=all 
combined=${var1}_list_${var2} 

echo ${!combined} 

wykrzyknikiem, odnosząc się do combined oznacza „użyć zmiennej, której nazwa jest określona przez zawartość z combined "

+1

Dziękuję bardzo! Próbowałem jednym strzałem to zrobić jedną linię za pomocą!, Ale ciągle dostaję błąd zastąpienia. Więc musisz użyć zmiennej pośredniej. Dzięki jeszcze raz! –

+0

Czy naprawdę nie można tego zrobić bez tworzenia nowej zmiennej? –

+0

@TimothySwan, 'eval" echo \ 'echo \\ $ \\ {$ {var1} _list _ $ {var2} \} \' "' ale to po prostu nieprzyjemne. –

6

Przewodnik zaawansowanego skryptu Bash zawiera odpowiedź (http://tldp.org/LDP/abs/html/ivr.html). Masz dwie możliwości, pierwsza to klasyczny wierzch:

#!/bin/bash 

server_list_all="server1 server2 server3"; 
var1="server"; 
var2="all"; 

server_var="${var1}_list_${var2}" 
eval servers=\$$server_var; 

echo $servers 

Alternatywnie można użyć skrótu bash $ {var!}

#!/bin/bash 

server_list_all="server1 server2 server3"; 
var1="server"; 
var2="all"; 

server_var="${var1}_list_${var2}" 
echo ${!server_var} 

Albo podejście działa.

Powiązane problemy