bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bash can't distinguish between empty and unset arrays


From: Stephane Chazelas
Subject: Re: bash can't distinguish between empty and unset arrays
Date: Thu, 4 Feb 2016 05:19:08 +0000
User-agent: Mutt/1.5.21 (2010-09-15)

2016-02-03 23:43:37 +0000, Martijn Dekker:
> bash treats an empty array as if it were an unset variable, which seems
> very illogical as empty is quite distinct from unset:
> 
> $ myarray=()
> $ [[ -v myarray ]] && echo set || echo unset
> unset

[[ -v var ]] is for scalar variables (AFAICT).
bash like ksh arrays to some extend overload. (as in $var is ${var[0]}).

$ bash -c 'a[1]=x; [[ -v a ]]' || echo unset
unset
$ bash -c 'a[1]=x; [[ -v a[@] ]]' && echo set
set
~$ bash -c 'a=(""); [[ -v a[@] ]]' && echo set
set

In:

$ bash -c 'a=(); [[ -v a[@] ]]' || echo unset
unset

It still returns "unset" as none of the elements are set.

You can always check whether the variable is "bound" with 
declare -p


declare -p array >/dev/null 2>&1 && echo set

I don't know how one can check whether the variable is
/declared/ or not though (when it's not "bound").


> $ set | grep ^myarray=        # yet, it's set:
> myarray=()
> $ set -u
> $ for i in "${x[@]}"; do :; done
> bash: x[@]: unbound variable
> 
> Note also that the "unbound variable" error is inconsistent with the
> behaviour of "$@"; I would have thought that, logically, "$@" and
> "${x[@]}" should behave the same way, since arrays are implemented as a
> logical extension of the positional parameters concept.

Agreed.

> zsh and ksh93 can distinguish between empty and unset arrays.
[...]

In zsh, arrays are a clearly distinct type.

You may want to check the archieve, I beleive it's been
discussed before.

-- 
Stephane



reply via email to

[Prev in Thread] Current Thread [Next in Thread]