在声明期间为只读变量赋值

在声明期间为只读变量赋值

以下类型的readonly变量定义有效吗?:

#!/bin/sh
readonly a=1
readonly b=1
readonly c=$((a+b))

是否允许/推荐这种类型的声明与赋值相结合?

答案1

您可以使用只读变量ab初始化只读变量c,如您在问题中所示。

一般来说,你会想使用

readonly c="$(( a + b ))"

即引用扩展。如果变量IFS的值包含数字2,则可能会导致 中出现空值c。该值将为空,因为 shell 会将参数分割到readonly2,从而产生命令

readonly c=

正在被处决。

例子:

$ cat script
#! /bin/sh

IFS=2
readonly a=1
readonly b=1
readonly c=$((a+b))
$ yash -o posixly-correct -x script
+ IFS=2
+ readonly 'a=1'
+ readonly 'b=1'
+ readonly 'c='

请注意,并非所有 shell 都这样工作:

$ bash --posix -x script
+ IFS=2
+ readonly a=1
+ a=1
+ readonly b=1
+ b=1
+ readonly c=2
+ c=2

答案2

我喜欢有常量=只读变量在我的 shell 脚本中。

也就是说,我已经和他们遇到了很多麻烦。


替代解决方案(引用)

我现在在这里投票支持答案,因为它很好地解释了这个问题。

但是,我以不同的方式处理这个问题:首先,我为 a 分配一个值普通的变量,然后我将其标记为只读,示例如下:

#!/bin/sh

# first, we create a variable and assign it a value
my_var=first_assign

# after that, we mark the variable as read-only
readonly my_var

# any further assignment attempt will be met with an error
my_var=any_further_assign

不同 shell 的错误消息可能略有不同,示例:

  • dash:

    readonly_assignment: 10: my_var: is read only
    
  • bash:

    readonly_assignment: line 10: my_var: readonly variable
    
  • zsh:

    readonly_assignment:10: read-only variable: my_var
    

相关内容