将默认数组写入Bash中的变量


10

我期待

excludes="${excludes:-( ${default_excludes[@]} )}"

如果$excludes为空,则为数组。不幸的是,后面的东西:-被认为是字符串。我是否错过了一些语法扭曲,还是不得不使用笨拙的

if [ -z "${excludes:-}" ]
then
    excludes=( "${default_excludes[@]}" )
fi

Answers:


10

您可以使用以下语法从另一个数组构造一个数组:

arr1=( "${arr2[@]}" )

可以将其转换为以下默认值语法:

arr1=("${arr1[@]:-${arr2[@]}}")

我已经测试了一些边缘情况,例如其中包含空格或换行符的数组成员,并且似乎可以正确处理它们。


3
如果arr2为空,则arr1变成长度为1的数组,其中包含一个空字符串
Andy

2

由于我遇到的情况arr2可能是空的,但是已经设置好了,所以找不到简单的解决方案。因此,我必须使用一个函数和全局temp变量。但是它在每种情况下以及bash 3.2和bash 4中都有效

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=("${!default}")
  else
    TEMP_VAR=("${@}")
  fi
}

set_temp_array arr1 "${arr2[@]}"
arr1="${TEMP_VAR[@]}"

我使用间接数组引用将值复制到TEMP_VAR,但无法在bash中找出间接数组分配,因此这两行和temp变量

为你的set -eu粉丝们

function set_temp_array()
{ # 1 - source_array_name $2-* default_values
  local default="$1"
  shift
  if declare -p $default >& /dev/null; then
    default="${default}[@]"
    TEMP_VAR=(${!default+"${!default}"})
  else
    TEMP_VAR=(${@+"${@}"})
  fi
}

set_temp_array arr1 ${arr2+"${arr2[@]}"}
arr1=(${TEMP_VAR+"${TEMP_VAR[@]}"})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.