2012-05-25 53 views
26

我有可變$foo="something"並想用:巴什 - 變量變量

bar="foo"; echo $($bar) 

獲得「東西」遙相呼應。

+2

請參見[BashFAQ/006](http://mywiki.wooledge.org/BashFAQ/006)。此外,您不應該嘗試在作業左側使用美元符號。 –

回答

51

在bash中,可以使用$ {!variable}來使用變量變量。

foo="something" 
bar="foo" 
echo "${!bar}" 
+0

比我的回答好得多。 – mkb

+0

@mkb我不知道eval :-) – dAm2K

+0

in'sh'它表示不好的替換。任何想法如何在'sh'中做到? –

5

eval echo \"\$$bar\"會做到這一點。

+5

請注意[eval']的安全含義(http://mywiki.wooledge.org/BashFAQ/048)。 –

+0

該解決方案具有與非Bash shell(例如,嵌入式系統或Docker容器等輕量級環境)POSIX兼容的優點。 您可以將值賦予另一個變量,如下所示: '''sh var = $(eval echo \「\ $$ bar \」) ''' –

6

接受的答案很好。然而,@愛迪生問及如何爲陣列做同樣的事情。訣竅是你想讓你的變量持有「[@]」,以便數組用「!」擴展。看看這個功能轉儲變量:

$ function dump_variables() { 
    for var in "[email protected]"; do 
     echo "$var=${!var}" 
    done 
} 
$ STRING="Hello World" 
$ ARRAY=("ab" "cd") 
$ dump_variables STRING ARRAY ARRAY[@] 

此輸出:

STRING=Hello World 
ARRAY=ab 
ARRAY[@]=ab cd 

當剛剛ARRAY給出的,顯示的第一個元素爲那正是由!擴大。通過給出ARRAY[@]格式,可以獲得數組及其所有值的擴展。

+0

處理數組的好處。任何想法如何獲得數組*索引* [manual](http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion)表明這通常是用'$ {!ARRAY [@]}'來完成的,這似乎與變量間接語法衝突。 – dimo414

+0

@ dimo414是的,通過間接獲取密鑰更棘手。您只需傳遞名稱,然後在方法中進行擴展:'local -a'keys =(「$ {!'」$ var「'[@]}」)''。 [關於Bash黑客的間接文章](http://wiki.bash-hackers.org/syntax/arrays#indirection)更深入。 – bishop

0

爲了更清楚如何使用數組做到這一點:

arr=('a' 'b' 'c') 
# construct a var assigning the string representation 
# of the variable (array) as its value: 
var=arr[@]   
echo "${!var}"