【发布时间】:2014-06-27 18:27:09
【问题描述】:
我们目前的设置是在配置文件中声明几个变量,然后我们运行一些依赖于这些变量的进程。我试图提供的附加功能是一个 default_variables 脚本,它将为配置文件中的所有变量提供默认值,同时不会覆盖配置文件中声明的任何内容。
这是我当前的代码:
#!/bin/bash -x
# allows var to be used as an associative array
declare -A var
# variable declarations must be of the form:
# var[var_name]=var_value
# after processing loop, the above will be evaluated as:
# export var_name=var_value
# declare default variables
var[a]=a_val
var[b]=b_val
var[c]=c_val
var[d]=d_val
# iterate on associative array indices
for default_var in `echo "${!var[@]}"`
do
test_var=\$${default_var}
# only export variables that have not been previously declared
if [[ -z `eval $test_var` ]]
then
# export each index name as a variable
export $default_var=${var[$default_var]}
fi
done
我目前遇到的错误是 eval 语句试图执行一个变量的值,如果它是在脚本运行之前声明的。例如,如果上面的脚本运行了两次,那么错误将是:
-sh: a_val: command not found
-sh: b_val: command not found
-sh: c_val: command not found
-sh: d_val: command not found
现在我肯定想用一种更优雅的方法来解决这个问题,但这是我能想到的最好的方法。最后,我知道正常导出值并单独检查每个变量以查看它们是否被分配将是一种更“正确”的方式,但我不想指数膨胀脚本,我不希望人们每次他们想向脚本添加新变量时都必须复制逻辑,我不能只在配置文件之前运行 default_variables 脚本,允许它覆盖默认值,因为一些默认值取决于配置值。
提前感谢您的帮助!
【问题讨论】:
标签: arrays bash variables global-variables associative-array