这是我目前的流程:
var[product]=messaging_app
var[component]=sms
var[version]=1.0.7
var[yum_location]=$product/$component/$deliverable_name
var[deliverable_name]=$product-$component-$version
# iterate on associative array indices
for default_var in "${!var[@]}" ; do
# skip variables that have been previously declared
if [[ -z ${!default_var} ]] ; then
# export each index as a variable, setting value to the value for that index in the array
export "$default_var=${var[$default_var]}"
fi
done
我正在寻找的核心功能是设置一个默认变量列表,它不会覆盖以前声明的变量。
上面的代码就是这样做的,但它也创造了这些变量的问题,现在不能相互依赖。这是因为从"${!var[@]}"
输出的关联数组索引的顺序并不总是与它们声明的顺序相同。
是否存在更简单的解决方案,如:
declare --nooverwrite this=that
我找不到类似的东西。
另外,我知道这可以用if语句完成。但是,使用一堆if语句会破坏脚本的可读性,并且有近100个默认变量。
答案 0 :(得分:1)
来自3.5.3 Shell Parameter Expansion:
$ {参数:=字}
如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
所以
: ${this:=that}
需要 :
,否则shell会将${this:=that}
视为一个命令来运行,作为一个命令,无论扩展到什么。
$ echo "$this"
$ : ${this:=that}
$ echo "$this"
that
$ this=foo
$ echo "$this"
foo
$ : ${this:=that}
$ echo "$this"
foo
你也可以在第一个地方使用变量(而不是单独使用),如果这更适合事情(但要确保清楚,因为在以后的编辑中很容易弄乱)。
$ echo "$this"
$ echo "${this:=that}"
that
$ echo "$this"
that
然而,动态执行此操作并不容易,可能需要eval
。