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

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

我正期待着

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

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

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

答案1

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

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

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

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

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

答案2

由于我遇到过 my 可能为空但已设置的情况arr2,所以我找不到简单的解决方案。所以我必须使用函数和全局临时变量。但它适用于所有情况以及 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 中的间接数组赋值,因此有两行和临时变量

对于你们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[@]}"})

相关内容