为什么不是每个变量在 Bash 中声明时都初始化为其数据类型特定的默认值?

为什么不是每个变量在 Bash 中声明时都初始化为其数据类型特定的默认值?

当我在 Bash 版本“GNU bash,版本 4.1.10(4)-release (i686-pc-cygwin)”中执行以下代码时,我得到:

declare a
declare -p a
# Output: -bash: declare: a: not found
declare -i b
declare -p b
# Output: -bash: declare: b: not found
declare -a c
declare -p c
# Output: declare -a c='()'
declare -A d
declare -p d
# Output: declare -A d='()'

可以说,我认为上述变量要么在所有情况下都应该被初始化,要么在任何情况下都不被初始化。这看起来比在声明时仅初始化数组更一致。

答案1

我认为人们总是可以安全且统一地声明和初始化变量,如下所示:

declare a=""
declare -p a
# Output: declare -- a=""
declare -i b=0
declare -p b
# Output: declare -i b="0"
declare -a c=()
declare -p c
# Output: declare -a c='()'
declare -A d=()
declare -p d
# Output: declare -A d='()'

鉴于 Bash shell 的不同版本之间似乎存在不同的行为。

如果在声明变量时未提供显式初始化值,则结果可能不是预期的,如以下使用局部变量的示例所示:

function foobar {
  declare a
  declare -i b
  declare -a c
  declare -A d
  declare -p a b c d
  a=a
  b=42
  c+=(c)
  d+=([d]=42)
  declare -p a b c d
}
foobar
# Output:
# declare -- a=""
# declare -i b=""
# declare -a c='()'
# declare -A d='()'
# Output:
# declare -- a="a"
# declare -i b="42"
# declare -a c='([0]="c")'
# declare -A d='([d]="42" )'
declare -p a b c d
# Output:
# bash: declare: a: not found
# bash: declare: b: not found
# bash: declare: c: not found
# bash: declare: d: not found

对于局部变量和后期初始化,一切都按预期工作。特别注意,函数declare -p a b c d内的第一个foobar报告所有变量都已初始化为其数据类型特定的默认值。将其与全局变量情况进行比较,其中ab变量分别报告为-bash: declare: a: not found-bash: declare: b: not found

相关内容