【发布时间】:2012-06-01 05:04:06
【问题描述】:
我有变量$foo="something" 并想使用:
bar="foo"; echo $($bar)
让“某事”得到回应。
【问题讨论】:
-
请参阅BashFAQ/006。此外,您不应尝试在作业的左侧使用美元符号。
我有变量$foo="something" 并想使用:
bar="foo"; echo $($bar)
让“某事”得到回应。
【问题讨论】:
在 bash 中,您可以使用${!variable} 来使用变量变量。
foo="something"
bar="foo"
echo "${!bar}"
# something
【讨论】:
sh 中表示替换错误。知道如何在sh 中做到这一点吗?
foo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]}
eval echo \"\$$bar\" 会这样做。
【讨论】:
sh var=$(eval echo \"\$$bar\")
接受的答案很棒。但是,@Edison 询问如何对数组执行相同的操作。诀窍是您希望您的变量包含“[@]”,以便使用“!”扩展数组。查看此函数以转储变量:
$ function dump_variables() {
for var in "$@"; 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[@] 格式,您可以扩展数组及其所有值。
【讨论】:
${!ARRAY[@]} 完成,这似乎与变量间接语法冲突。
local -a 'keys=("${!'"$var"'[@]}")'。 indirection article on Bash Hackers 更深入。
为了更清楚如何处理数组:
arr=( 'a' 'b' 'c' )
# construct a var assigning the string representation
# of the variable (array) as its value:
var=arr[@]
echo "${!var}"
【讨论】: