Bash使用引用从数组声明/ init变量

时间:2017-03-05 16:36:44

标签: bash shell scripting

以下代码段将尝试初始化arrVAR_INIT数组中的变量:

#!/bin/bash

set -u

declare -a arrVAR_INIT=(
    VERBOSE=FALSE
    DEBUG=FALSE
    MEMORY="1024k"
    DEBUGFILE=
)

# declare -A arrVAR_DEFAULT_VALUE

for VAR in "${arrVAR_INIT[@]}"
do
    VAR_NAME=${VAR%%=*}
    VAR_VALUE="${VAR#*=}"
    echo "$VAR : $VAR_NAME = \"$VAR_VALUE\""

    #### ERROR: !VAR_NAME: unbound variable
    declare $VAR_NAME="$VAR_VALUE"

    # eval "arrVAR_DEFAULT_VALUE[${VAR%%=*}]=\"${VAR#*=}\""

done

请注意,通过使用set -u(将未设置的变量视为错误,并立即退出),上面的代码将抛出!VAR_NAME:unbound variable 错误并退出。

通过引用启动变量的正确方法是什么?

可以在不使用eval的情况下完成吗?

2 个答案:

答案 0 :(得分:1)

快速回答是:

declare "$VAR_NAME=$VAR_VALUE"

知道如果你不能保证变量的内容是安全的,这可能会打开代码注入漏洞。

你有没有使用关联数组的原因?你已经有一个数组开始,为什么不将它关联起来并从中读取而不是初始化其他变量?

declare -A arrVAR_INIT=(
    [VERBOSE]=FALSE
    [DEBUG]=FALSE
    [MEMORY]="1024k"
    [DEBUGFILE]=
)

echo "${arrVAR_INIT[VERBOSE]}" # An example of getting a value out of the array.

答案 1 :(得分:0)

您可以像这样使用declare $var_name="$var_value"

#!/bin/bash
set -u

declare -a arrvar_init=(
    VERBOSE=FALSE
    DEBUG=FALSE
    MEMORY="1024k"
    DEBUGFILE=
)

# declare -A arrVAR_DEFAULT_VALUE

for var in "${arrvar_init[@]}"
do
    var_name=${var%%=*}
    var_value=${var#*=}

    declare $var_name="$var_value"

    declare -p $var_name
done

避免对变量名使用全部大写名称,以避免与bash ENV变量发生冲突。