[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Expansions based on variable existence (e.g. ${var+exists}) yield incons
From: |
andrej |
Subject: |
Expansions based on variable existence (e.g. ${var+exists}) yield inconsistent results. |
Date: |
Mon, 20 Apr 2020 17:55:46 +0200 |
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]
- Expansions based on variable existence (e.g. ${var+exists}) yield inconsistent results.,
andrej <=