在bash中初始化数组时declare命令有什么用?

sks*_*174 2 arrays bash declare

arr=("Jane Doe" "John Doe" "Janet")
Run Code Online (Sandbox Code Playgroud)
declare -a arr=("Jane Doe" "John Doe" "Janet")
Run Code Online (Sandbox Code Playgroud)

bash中的两个数组初始化有什么区别?

Joh*_*ger 5

所提供的两个数组初始化,假设它们实际上是初始化(见下文),如果declare发生在顶层,则意味着完全相同的事情。但是,当declare在函数内部执行时,如果没有-g选项,则相当于local,声明函数的局部变量。另一方面,直接初始化声明一个全局变量,无论它出现在哪里。

example() {
  direct=(a b c)
  declare -a indirect=(d e f)

  #prints a
  echo "$direct"

  #prints d
  echo "$indirect"
}

example

#prints a
echo "$direct"

#prints nothing
echo "$indirect"
Run Code Online (Sandbox Code Playgroud)

当然,local实际上的意图是声明局部变量会更清楚。 declare与其他选项结合使用会更有趣,包括与-a. declare -a -r foo=(1 2 3)例如,考虑一下。


一开始,我提出了一种可能性,即所讨论的一个或两个命令可能不是“初始化”。在这里,我区分了初始化(为以前不存在的变量定义初始值)和赋值(更改已存在的变量的值)。如果我特别小心的话,我会注意到虽然该declare版本包含初始化,但整个命令并没有很好地表征为初始化。

这提出了所讨论的两个命令之间的另一个区别:

  • 仅当具有给定名称的全局变量和范围内局部变量都不存在时,直接赋值版本才用作新(全局)变量的初始化。如果确实存在具有给定名称的变量,则它只是一个赋值。另一方面,
  • declare命令中的初始化仅用作初始化。如果声明的变量已经存在,则通过declare命令指定的任何初始值都将被忽略。