以下代码段将尝试初始化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
的情况下完成吗?
答案 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变量发生冲突。