Bash empty array expansion with `set -u`

后端 未结 11 2205
不知归路
不知归路 2020-12-12 15:37

I\'m writing a bash script which has set -u, and I have a problem with empty array expansion: bash appears to treat an empty array as an unset variable during e

11条回答
  •  感情败类
    2020-12-12 16:08

    The only safe idiom is ${arr[@]+"${arr[@]}"}

    This is already the recommendation in ikegami's answer, but there's a lot of misinformation and guesswork in this thread. Other patterns, such as ${arr[@]-} or ${arr[@]:0}, are not safe across all major versions of Bash.

    As the table below shows, the only expansion that is reliable across all modern-ish Bash versions is ${arr[@]+"${arr[@]}"} (column +"). Of note, several other expansions fail in Bash 4.2, including (unfortunately) the shorter ${arr[@]:0} idiom, which doesn't just produce an incorrect result but actually fails. If you need to support versions prior to 4.4, and in particular 4.2, this is the only working idiom.

    Unfortunately other + expansions that, at a glance, look the same do indeed emit different behavior. :+ expansion is not safe, because :-expansion treats an array with a single empty element (('')) as "null" and thus doesn't (consistently) expand to the same result.

    Quoting the full expansion instead of the nested array ("${arr[@]+${arr[@]}}"), which I would have expected to be roughly equivalent, is similarly unsafe in 4.2.

    You can see the code that generated this data along with results for several additional version of bash in this gist.

提交回复
热议问题