我正期待着
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[@]}"})