【问题标题】:Bash assign variable using another variableBash 使用另一个变量分配变量
【发布时间】:2015-02-25 20:38:52
【问题描述】:

我不完全确定如何写标题,但我想做的是分别将username 设置为$DEV_ENVIRONMENT$STAGE_ENVIRONMENT$PROD_ENVIRONMENT,每个都在我的属性文件。

我的函数将接受一个参数(DEVSTAGEPROD)并根据$_ENVIRONMENT 中定义的边缘检查主机名。

while IFS=',' read -ra line
do
        for i in "${line[@]}"
        do
                if [ $(hostname) = $i ]
                then
                        username="$1"_USERNAME
                        break
                fi
        done
done <<< "${1}_ENVIRONMENT"

例如,如果我传入DEV,那么我希望将username 设置为$DEV_USERNAME,并且我希望while 循环搜索$DEV_ENVIRONMENT 中定义的节点,两者都是这将是从我的属性文件中读取的值。

【问题讨论】:

    标签: bash variables variable-assignment


    【解决方案1】:

    Bash 支持indirection expansion,所以你可以这样做:

    var=${1}_ENVIRONMENT
    username=${!var}
    

    而不是稍微繁琐且有潜在危险的 eval:

    eval username=\$${1}_ENVIRONMENT
    

    所以对于你的代码:

    while IFS=',' read -ra line
    do
            for i in "${line[@]}"
            do
                    if [ $(hostname) = $i ]
                    then
                            var="$1"_USERNAME
                            username=${!var}
                            break
                    fi
            done
    done <<< "${1}_ENVIRONMENT"
    

    【讨论】:

    • 完美!我会在允许的情况下接受您的回答,但您介意扩大使用您发布的 eval 示例的危险吗?
    • 我本来打算建议 eval 或 declare,但这个解决方案效果更好。
    • eval 允许您在语句中执行任何操作,因此您可以,例如让var="; echo evil"; eval user=\$$var 回显evil,即它受值注入的影响。
    • eval 命令非常强大,而且极易被滥用。 Examples of bad use of eval
    • BashFAQ #006 -- mywiki.wooledge.org/BashFAQ/006 -- 可能是另一个值得参考的参考。
    猜你喜欢
    • 2015-09-12
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多