1 | readonly
|
2 | ===
|
3 |
|
4 | 标记shell变量或函数为只读
|
5 |
|
6 | ## 语法
|
7 |
|
8 | ```shell
|
9 | readonly [-aAf] [name[=value] ...]
|
10 | readonly -p
|
11 | ```
|
12 |
|
13 | ## 主要用途
|
14 |
|
15 | - 定义一到多个变量并设置只读属性。
|
16 | - 为已定义的一到多个变量设置只读属性。
|
17 | - 显示全部包含只读属性的变量。
|
18 | - 为已定义的一到多个函数设置只读属性。
|
19 | - 显示全部包含只读属性的函数。
|
20 |
|
21 | ## 选项
|
22 |
|
23 | ```shell
|
24 | -a:指向数组。
|
25 | -A:指向关联数组。
|
26 | -f:指向函数。
|
27 | -p:显示全部只读变量。
|
28 | --:在它之后的选项无效。
|
29 | ```
|
30 |
|
31 | ## 参数
|
32 |
|
33 | ```shell
|
34 | name(可选):变量名或函数名
|
35 | value(可选):变量的值
|
36 | ```
|
37 |
|
38 | ### 返回值
|
39 |
|
40 | readonly返回true除非你提供了非法选项或非法名称。
|
41 |
|
42 | ## 例子
|
43 |
|
44 | ```shell
|
45 | # 定义变量并增加只读属性
|
46 | readonly var1=13 var2
|
47 | readonly -a arr1=(1 2 3 4 5) arr2=('z' 'x' 'c')
|
48 | # 必须有 '-A' 选项
|
49 | readonly -A dict1=(['key1']='value1')
|
50 | ```
|
51 |
|
52 | ```shell
|
53 | # 先定义变量、函数,然后再为它们添加只读属性
|
54 | max=3
|
55 | readonly max
|
56 |
|
57 | # 数组定义时可以不加 `declare -a`
|
58 | seasons=('spring' 'summer' 'autumn' 'winter')
|
59 | # 为数组添加只读属性时可以不加 `-a` 选项
|
60 | readonly seasons
|
61 |
|
62 | declare -A man=(['age']=23 ['height']='190cm')
|
63 | # 为关联数组添加只读属性时可以不加 `-A` 选项
|
64 | readonly man
|
65 |
|
66 | function foo(){ echo 'bar'; }
|
67 | # 为函数添加只读属性时必须加 `-f` 选项
|
68 | readonly -f foo
|
69 | ```
|
70 |
|
71 | ```shell
|
72 | # 显示全部只读变量,以下两个命令的显示结果一样
|
73 | readonly
|
74 | readonly -p
|
75 | # 显示全部拥有只读属性的数组
|
76 | readonly -a
|
77 | # 显示全部拥有只读属性的关联数组
|
78 | readonly -A
|
79 | # 显示全部拥有只读属性的函数
|
80 | readonly -f
|
81 | ```
|
82 |
|
83 | ## 常见错误
|
84 |
|
85 | 对于只读变量而言,若用户对其值进行修改,则会立即报错。例如,使用该指令定义一个只读变量"test",并且将其值初始化为"ok",输入如下命令:
|
86 |
|
87 | ```shell
|
88 | [root@localhost ~]# readonly test='ok' #定义只读变量并初始化
|
89 | ```
|
90 |
|
91 | 那么当用户直接修改该只读变量时就会报错,如下所示:
|
92 |
|
93 | ```shell
|
94 | [root@localhost ~]# test='my' #试图修改只读变量的值
|
95 | -bash: test: readonly variable
|
96 | ```
|
97 |
|
98 | 当用户试图修改只读变量的值时,会被提示该变量为只读变量。
|
99 |
|
100 | ## 注意
|
101 |
|
102 | 1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
|
103 | 2. `declare +r`不能去除只读属性, `unset`不能删除只读变量。
|
104 |
|
105 |
|