【问题标题】:Bash - Expanding a variable into another variable nameBash - 将变量扩展为另一个变量名
【发布时间】:2019-11-24 04:26:06
【问题描述】:

假设我有这些变量:

VAR_A=resultA
VAR_B=resultB
X=A

我想根据X的值得到VAR_AVAR_B的值。

这是有效的,并提供resultA

VAR="VAR_$X"
RESULT=${!VAR}

我的问题是,是否有一个单行字?

因为indirection expansion 如果不是扩展的变量的唯一名称,它似乎不起作用。我试过了:

RESULT=${!VAR_$X}
RESULT=${!"VAR_$X"}

...还有很多其他的组合,但总是写“bad substitution”...

【问题讨论】:

  • @CorentinLimier 不,对不起,这不是同一个问题,因为 X 变量作为字符串包含在另一个变量中,在这种情况下,间接扩展不起作用。这就是我问题的重点!

标签: bash variable-expansion parameter-expansion


【解决方案1】:

这应该可行。

RESULT=$(eval echo \$VAR_$X)

$ 前面的\ 使其按字面意思对待。

【讨论】:

  • 更短的eval RESULT=\$VAR_$X
【解决方案2】:

在使用${!var} 的 bash 2 表示法时,似乎没有更短的方法。 作为参考,“新”bash 2 表示法是 value=${!string_name_var},“旧”表示法是:eval value=\$$string_name_var

你可以使用旧的符号来让它像你想要的那样工作:

eval RESULT=\$"VAR_$X"

参考:https://www.tldp.org/LDP/abs/html/bashver2.html#BASH2REF

【讨论】:

    【解决方案3】:

    您最好使用关联数组,至少在最新版本的 Bash 中:

    declare -A var=(
        [A]=resultA
        [B]=resultB
    )
    x=A
    result="${var[$x]}"
    echo "$result"  # -> resultA
    

    【讨论】:

    • 我知道这将是一个更好的选择,但我所处的环境是不可能的(在 Gitlab-CI 中声明的环境变量 - 不允许使用数组)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多