在bash中,declare -rreadonly有什么区别?

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

我不确定该选择哪个。

最佳答案

tl; dr readonly使用全局偶数内部函数的默认范围。 declare在函数中时会使用局部作用域(除非declare -g)。

乍一看,没什么区别。

使用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

现在查看在函数中定义时的区别

# 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"

为了增加更多细微差别,可以使用readonly将本地声明的变量属性更改为只读,而不影响范围。

$ function A() {
    declare a="a1"
    declare -p a
    readonly a
    declare -p a
}

$ A
declare -- a="a1"
declare -r a="a1"

$ declare -p a
-bash: declare: a: not found




注意:将-g标志添加到declare语句(例如declare -rg a="a1")将使变量作用域变为全局。 (感谢@chepner)。

注意:readonly是“特殊内置”。如果Bash处于POSIX模式,则readonly(而不是declare)具有"returning an error status will not cause the shell to exit"效果。

关于bash - bash中 `declare -r`和 `readonly`有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30362831/

10-15 05:24