bug-bash
[Top][All Lists]
Advanced

[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]



reply via email to

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