Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -DDEFAULT_PATH_VALUE='/usr/local/sbin:/usr/local/bin:/usr/bin' -DSTANDARD_UTILS_PATH='/usr/bin' -DSYS_BASHRC='/etc/bash.bashrc' -DSYS_BASH_LOGOUT='/etc/bash.bash_logout' -DNON_INTERACTIVE_LOGIN_SHELLS -Wno-parentheses -Wno-format-security uname output: Linux charon 5.6.4-arch1-1-user-regd #1 SMP PREEMPT Fri, 17 Apr 2020 12:06:27 +0000 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 5.0 Patch Level: 16 Release Status: release Description: Variable existence testing doesn't match variables that are (only) declared. Unless the declared variables are redeclared as arrays. Other variable existence tests yield surprising results as well. (This is all about existence tests, i.e., ones without the extra ':' that tests for emptiness.) In particular, Example 4 below exposes a situation in which a variable doesn't seem to be set, yet cannot be set. Example 5 below shows that empty arrays are treated differently in terms of variable existence. Also, redeclaration of a variable as an array seems to have an "assignment effect" on it (in the sense of making it detectable by existence tests). Redeclaration as an integer doesn't have this effect. Repeat-By: Example 1: declare var # The same problem occurs with -i, -a and -A. echo "${!var@}" # empty [unexpected] echo "${var+exists}" # empty [unexpected] echo "${var-nonexistent}" # nonexistent [unexpected] Example 2: declare var declare -A var echo "${!var@}" # var [expected] << Difference from Experiment 1 echo "${var+exists}" # empty [unexpected] echo "${var[@]+exists}" # empty [somewhat unexpected] echo "${var-nonexistent}" # nonexistent [unexpected] echo "${var[@]-nonexistent}" # nonexistent [somewhat unexpected] Example 3: declare var= echo "${!var@}" # var [expected] echo "${var+exists}" # exists [expected] echo "${var-nonexistent}" # empty [expected] Example 4: declare -r var echo "${!var@}" # empty [unexpected] echo "${var+exists}" # empty [unexpected] echo "${var-nonexistent}" # nonexistent [unexpected] var= # Error! [inconsistent] Example 5: var=() echo "${!var@}" # var [expected] echo "${var+exists}" # empty [unexpected] echo "${var[@]+exists}" # empty [somewhat unexpected] echo "${var-nonexistent}" # nonexistent [unexpected] echo "${var[@]-nonexistent}" # nonexistent [somewhat unexpected] var=(blah) echo "${var+exists}" # exists [expected] echo "${var[@]+exists}" # exists [expected] echo "${var-nonexistent}" # blah [expected] echo "${var[@]-nonexistent}" # blah [expected]