在bash中`declare -r`和`readonly`有什么区别?

Jam*_*979 24 bash

在bash,就是在差异declare -rreadonly

$ declare -r a="a1"
$ readonly b="b1"
Run Code Online (Sandbox Code Playgroud)

我不知道该选哪个.

Jam*_*979 30

答:范围

乍一看,没有区别.

使用declare -p检查

$ declare -r a=a1
$ readonly b=b1
$ declare -p a b
declare -r a="a1"
declare -r b="b1"

# variable a and variable b are the same
Run Code Online (Sandbox Code Playgroud)

但是,范围是不同的

# define variables inside function A
$ function A() {
      declare -r x=x1
      readonly y=y1
      declare -p x y
  }

$ A
declare -r x="x1"
declare -r y="y1"

# ***calling function A again will incur an error because variable y
#    was defined using readonly so y is in the global scope***

$ A
-bash: y: readonly variable
declare -r x="x1"
declare -r y="y1"

# after call of function A, the variable y is still defined

$ declare -p x y
bash: declare: x: not found
declare -r y="y1"
Run Code Online (Sandbox Code Playgroud)

因此,一个区别是readonly将变量范围设为全局. declare使变量范围成为本地(这是预期的).


注意:declare -greadonly语句中添加标志(例如-g)会使变量范围成为全局变量.(谢谢@chepner).

注意:declare是" 特殊建筑 ".如果Bash处于declare -rg a="a1"模式,那么readonly(而不是POSIX)具有" 返回错误状态将不会导致shell退出 "的效果.

  • 请注意,从`bash` 4.2开始,`declare -gr`似乎与`readonly`相同. (5认同)
  • 回复:“`readonly` 将使变量作用域 *global*”:这是误导;如果一个变量已经是局部的,那么 `readonly` 不会突然使它成为全局的。更正确的说法是 `readonly` 根本不影响变量作用域,全局作用域是默认作用域。 (3认同)
  • 我喜欢你回答自己,4年后回答仍然是最好的答案 (2认同)