Arrays 在'中处理bash空数组的可靠版本独立(3.2..4.4)方式-u';模式

Arrays 在'中处理bash空数组的可靠版本独立(3.2..4.4)方式-u';模式,arrays,bash,Arrays,Bash,虽然中建议的解决方案对我来说效果很好,但最近发布的(2016/09/16)Bash4.4(例如,Debian stretch中提供的)中改变了阵列处理 现在空阵列扩展不会发出警告 $ set -u $ arr=() $ echo "${arr[@]}" $ # everything is fine 相关问题中提出的解决方案在bash-4.4中失败: $ set -u $ arr2=() $ arr2=( ${arr2[@] + "${arr2[@]}"} 'foo' ) bash: ${ar

虽然中建议的解决方案对我来说效果很好,但最近发布的(2016/09/16)Bash4.4(例如,Debian stretch中提供的)中改变了阵列处理

现在空阵列扩展不会发出警告

$ set -u
$ arr=()
$ echo "${arr[@]}"

$ # everything is fine
相关问题中提出的解决方案在bash-4.4中失败:

$ set -u
$ arr2=()
$ arr2=( ${arr2[@] + "${arr2[@]}"} 'foo' )
bash: ${arr2[@] + "$arr2[@]"}: bad substitution
是否有人在不额外检查数组长度或bash版本的情况下,对(或多或少)版本无关的解决方案提出了建议? 我自己还在调查bash的最新变化

编辑

由于我最初的问题似乎有点混乱,下面是我试图实现的澄清。 测试脚本:

#!/usr/bin/env bash
set -euo pipefail
bash --version | head -n1

arr=()

# some external environment variables are set / command line arguments passed to script
if test -n "${USE_EXTRA_ARGUMENT_1-}" ; then
  arr=( ${arr[@] + "${arr[@]}"} 'foo' )
fi

if test -n "${USE_EXTRA_ARGUMENT_2-}" ; then
  arr=( ${arr[@] + "${arr[@]}"} 'bar' )
fi

# just a dummy command
echo "${arr[@]-}"
Bash 4.3(Arch linux)运行:

Bash 4.4(Debian stretch)运行:


或者我在使用bash数组时犯了严重错误?

前面的空格
+
是错误的;你是说

arr2=( ${arr2[@]+"${arr2[@]}"} 'foo' )
不过,使用
+=
操作符要简单得多

arr2+=(foo)

我真诚的建议是改用Python。我确实非常喜欢并使用Python,但有时这不是一个选项这与
set-u
无关
${arr[@]+…}
是糟糕的语法。对于来这里试图解决Bash 4.4之前版本中的
set-u
错误的人,请参阅我的答案。谢谢你,伙计,你救了我,我想不到空格
$ USE_EXTRA_ARGUMENT_1=baz bash xxx.sh
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)
xxx.sh: line 9: ${arr[@] + "${arr[@]}"}: bad substitution
arr2=( ${arr2[@]+"${arr2[@]}"} 'foo' )
arr2+=(foo)