仅在先前未声明bash变量的情况下设置bash变量的默认值

时间:2015-01-23 20:31:25

标签: linux bash variables scripting variable-expansion

这是我目前的流程:

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个默认变量。

1 个答案:

答案 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