【问题标题】:Bash - variable variables [duplicate]Bash - 变量变量[重复]
【发布时间】:2012-06-01 05:04:06
【问题描述】:

我有变量$foo="something" 并想使用:

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

让“某事”得到回应。

【问题讨论】:

  • 请参阅BashFAQ/006。此外,您不应尝试在作业的左侧使用美元符号。

标签: bash variables


【解决方案1】:

在 bash 中,您可以使用${!variable} 来使用变量变量。

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

# something

【讨论】:

  • sh 中表示替换错误。知道如何在sh 中做到这一点吗?
  • 如何处理数组?
  • @Edison foo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]}
  • 我最终做了类似 "read -a subNames
  • @Edison 另见my recent answer
【解决方案2】:

eval echo \"\$$bar\" 会这样做。

【讨论】:

  • 此解决方案的优点是与非 Bash shell 的 POSIX 兼容(例如,嵌入式系统或 Docker 容器等轻量级环境)。您可以将值分配给另一个变量,如下所示:sh var=$(eval echo \"\$$bar\")
【解决方案3】:

接受的答案很棒。但是,@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[@] 格式,您可以扩展数组及其所有值。

【讨论】:

  • 关于处理数组的要点。知道如何获取数组的 indices 吗? manual 表示这通常使用${!ARRAY[@]} 完成,这似乎与变量间接语法冲突。
  • @dimo414 是的,通过间接获取密钥比较棘手。您必须只传递名称,然后在方法中进行扩展:local -a 'keys=("${!'"$var"'[@]}")'indirection article on Bash Hackers 更深入。
【解决方案4】:

为了更清楚如何处理数组:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多