以下类型的readonly
变量定义有效吗?:
#!/bin/sh
readonly a=1
readonly b=1
readonly c=$((a+b))
是否允许/推荐这种类型的声明与赋值相结合?
答案1
您可以使用只读变量a
并b
初始化只读变量c
,如您在问题中所示。
一般来说,你会想使用
readonly c="$(( a + b ))"
即引用扩展。如果变量IFS
的值包含数字2
,则可能会导致 中出现空值c
。该值将为空,因为 shell 会将参数分割到readonly
上2
,从而产生命令
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