当我在 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
报告所有变量都已初始化为其数据类型特定的默认值。将其与全局变量情况进行比较,其中a
和b
变量分别报告为-bash: declare: a: not found
和-bash: declare: b: not found
。