On Tue, Jul 26, 2022 at 07:13:41AM +0200, Laszlo Ersek wrote:
>
> - for (( _i = 0; _i < ${#_cleanup_hook[@]}; ++_i )); do
> - ${_cleanup_hook[_i]}
> + for (( _i = 0; _i < $_cleanup_hook_count; ++_i )); do
> + local -n _hook=_cleanup_hook$_i
> + "${_hook[@]}"
BTW, "nameref" variables seem like a relatively new addition to bash;
for example RHEL7 does not have them. Interestingly, the RHEL7 manual
also does not document a nameref-like construct that *does* work in
RHEL7, namely:
$ bar=foo
$ baz=bar
$ echo ${!baz}
foo
Oh. Okay, namerefs are out. But indirect variables aren't much better:
However, I couldn't find a syntax that made this feature work with array
variables. In particular, ${!name[@]} stands for "List of array keys".
On the web, I've found:
var=varname
tmp=${var}[@]
"${!tmp}"
https://mywiki.wooledge.org/BashFAQ/006
but that's still horrible; I'd rather just go for eval at this point.
I wonder if the bash release notes mention "nameref" as a more flexible
version of "indirect expansion"... Hm, nameref was new in bash-4.3
<
https://lwn.net/Articles/589566/>, and RHEL7 has bash-4.2.46-35.el7_9,
so the lack of "nameref" is understandable (not that it matters for
upstream nbdkit :)); indirect expansion is not mentioned however as a
similar feature.
At least RHEL 7 has bash 4.2, which added 'local -ag' for declaring
global arrays even within function scope. Bash 4.1 (hello RHEL 6)
lacked even that.
At any rate, I'll push the patch to switch to something that works on
bash 4.2 and RHEL 6 shortly.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization:
qemu.org |
libvirt.org