Skip to content

Commit b00a527

Browse files
authored
Update declare.md
1. 对文件内容进行更新。 2. @jaywcjlove 看起来没有local命令,我考虑新建这个命令的文件。
1 parent cc9382a commit b00a527

File tree

1 file changed

+226
-22
lines changed

1 file changed

+226
-22
lines changed

command/declare.md

Lines changed: 226 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,255 @@
11
declare
22
===
33

4-
声明或显示shell变量
4+
声明变量,设置或显示变量的值和属性。
55

6-
## 补充说明
7-
8-
**declare命令** 用于声明和显示已存在的shell变量。当不提供变量名参数时显示所有shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。declare的功能与typeset命令的功能是相同的。
9-
10-
### 语法
6+
### 概要
117

128
```shell
13-
declare(选项)(参数)
9+
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
1410
```
1511

12+
### 主要用途
13+
14+
- 显示包含指定属性的全部变量和值
15+
16+
- 显示包含指定属性的一到多个变量和值
17+
18+
- 显示一到多个变量的属性和值
19+
20+
- 显示所有变量的属性和值并显示函数的定义
21+
22+
- 显示所有变量的属性和值
23+
24+
- 显示所有全局变量的属性和值
25+
26+
27+
- 显示全部函数名和函数定义
28+
29+
- 只显示全部函数名
30+
31+
- 显示一到多个函数名和函数定义
32+
33+
- 只显示一到多个函数名
34+
35+
36+
- 声明全局变量(可选:赋值)
37+
38+
- 声明变量(可选:赋值、属性)
39+
40+
- 增加、删除变量的属性(可选:赋值)
41+
42+
1643
### 选项
1744

1845
```shell
19-
+/-:"-"可用来指定变量的属性,"+"则是取消变量所设的属性;
20-
-f:仅显示函数;
21-
r:将变量设置为只读;
22-
x:指定的变量会成为环境变量,可供shell以外的程序来使用;
23-
i:[设置值]可以是数值,字符串或运算式。
46+
-f 将操作或显示限制为函数名及函数定义。
47+
48+
-F 只显示函数名(调试时附加行号和源文件)。
49+
50+
-g 在shell函数中使用时创建全局变量;其他情况下忽略。
51+
52+
-p 显示每个名称的属性和值。
53+
54+
55+
*设置属性的选项:
56+
57+
-a 创建数组(如果支持)。
58+
59+
-A 创建关联数组(如果支持)。
60+
61+
-i 增加整型属性。
62+
63+
+i 删除整型属性。
64+
65+
-l 增加小写属性,变量的值将转换为小写。
66+
67+
+l 删除小写属性。
68+
69+
-n 增加引用属性(如果该选项存在)。
70+
71+
+n 删除引用属性。
72+
73+
-r 增加只读属性。
74+
75+
-t 增加追踪属性。
76+
77+
+t 删除追踪属性。
78+
79+
-u 增加大写属性,变量的值将转换为大写。
80+
81+
+u 删除大写属性。
82+
83+
-x 增加导出属性。
84+
85+
+x 删除导出属性。
2486
```
2587

26-
### 参数
88+
#### 参数
2789

28-
shell变量:声明shell变量,格式为“变量名=值”
90+
name(可选):变量名或函数名
2991

30-
### 实例
92+
value(可选):变量的值。
3193

32-
首先使用declare命令定义shell变量"test",并且将其值设置为"wangchujiang.com",输入如下命令:
94+
#### 返回值
95+
96+
declare返回true除非你提供了非法选项或赋值错误。具体导致异常的情况请查看**讨论**章节的**关于异常情况**
97+
98+
### 例子
3399

34100
```shell
35-
declare test='wangchujiang.com' #定义并初始化shell变量
101+
# 声明变量,当然也欢迎您在这个网站(感谢本项目发起人 @jaywcjlove)查询linux命令。
102+
declare reference_website='https://wangchujiang.com/linux-command/'
103+
104+
# 显示所有包含整型属性的变量和值。
105+
declare -i
106+
# 定义变量b并赋值为3,具有整型属性。
107+
declare -i b=5
108+
# 显示属性,返回 declare -i b="5"。
109+
declare -p b
110+
# 删除整型属性。
111+
declare +i b
112+
# 显示属性,返回 declare -- b="5"。
113+
declare -p b
114+
115+
# 变量大小写属性设置的作用。
116+
declare -u uc_var='abc'
117+
declare -l lc_var='ABC'
118+
# 查看变量的值。
119+
echo "${uc_var} ${lc_var}"
120+
# 返回 'ABC abc';
121+
# 根据变量属性强制转换值的英文大小写。
122+
123+
# 导出属性的相关内容请查看'export'命令。
124+
# 只读属性的相关内容请查看'readonly'命令。
36125
```
37126

38-
上面的命令执行后,再使用echo命令将该shell变量值输出,输入如下命令:
127+
```shell
128+
# 定义函数内的全局变量
129+
function test(){
130+
declare -g a=3
131+
# 或者
132+
local -g b=3
133+
# 或者
134+
c=3
135+
# 让我们查看它们的属性。
136+
declare -p a b c
137+
}
138+
# 执行函数。
139+
test
140+
# 返回结果。
141+
# declare -- a="3"
142+
# declare -- b="3"
143+
# declare -- c="3"
144+
145+
#定义函数外的全局变量
146+
declare a=3
147+
b=3
148+
declare –p a b
149+
# 返回结果。
150+
# declare -- a="3"
151+
# declare -- b="3"
152+
153+
#定义局部变量
154+
function test2(){
155+
local -i a=3
156+
declare -i b=3
157+
}
158+
test2
159+
echo "${a} ${b}"
160+
# 没有该变量(已经被销毁了)
161+
162+
# 因此,我们日常脚本中最常见的类似于'a=3'实际上是声明并赋值了一个全局变量。
163+
# 在接下来的 **讨论** 环节会延伸讨论全局和局部变量问题。
164+
```
39165

40166
```shell
41-
echo $test #输出shell变量的值
167+
# 注意,不能使用 `+a` 或 `+A` 取消数组,也不能使用 `+r` 取消只读属性。
168+
169+
# 定义只读数组,设置属性的同时定义赋值。
170+
declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
171+
# 或者这样。
172+
season=('Spring' 'Summer' 'Autumn' 'Winter')
173+
declare -ar season
174+
# 显示所有数组。
175+
declare -a
176+
177+
# 定义关联数组。
178+
declare -A fruits=(['apple']='red' ['banana']='yellow')
179+
# 显示所有关联数组。
180+
declare -A
42181
```
43182

44-
上面的指令执行后,其输出的结果如下:
183+
```shell
184+
# 显示所有变量的属性和值并显示函数的定义,输出很长;)
185+
declare
186+
187+
# 显示所有变量的属性和值。
188+
declare -p
189+
190+
# 显示所有全局变量的属性和值。
191+
declare -g
192+
```
45193

46194
```shell
47-
wangchujiang.com
195+
# 显示全部函数名和函数定义。
196+
declare -f
197+
198+
# 只显示全部函数名。
199+
declare -F
200+
201+
# 定义两个函数。
202+
function func_a(){ echo $(date +"%F %T"); }
203+
function func_b(){ cd /; ls -lh --sort=time; }
204+
205+
# 显示一到多个函数名和函数定义。
206+
declare -f func_a func_b
207+
208+
# 只显示一到多个函数名。
209+
# 验证某个名称是否已经定义为函数时有用。
210+
declare -F func_a func_b
211+
# 最好不要让函数名和变量名相同。
48212
```
49213

50214

51-
<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->
215+
### 讨论
216+
217+
1. 全局和局部变量
218+
219+
正如上面**例子**指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里
220+
做个简要地介绍,当然你也可以很方便的搜索到相关内容。
221+
222+
- 全局变量:在整个脚本执行期间,只要没有被删除就**一直存在**
223+
- 局部变量:在函数内定义,函数执行后就被删除。
224+
225+
建议函数内使用`local`命令,函数外使用`declare`命令。
226+
227+
> *不要在脚本中定义过多的全局变量,那样可能会被其他函数调用造成意料之外的后果,并且也不方便检查出来。*
228+
>
229+
> *更不用说缺乏必要的注释了 —— ZhuangZhu-74*
230+
231+
相关资料:
232+
233+
- [google提供的编码规范](https://github.com/google/styleguide)
234+
235+
- [全局变量的讨论](https://unix.stackexchange.com/questions/381761/what-do-declare-name-and-declare-g-do)
236+
237+
2. 关于`declare` `typeset` `export` `local` `readonly`命令
238+
239+
为什么`declare`能做到的事,还需要定义其他这些命令呢?
240+
241+
因为这样语句含义会更加明确,例如:
242+
- 设置导出属性的变量时,`export var``declare -x var`
243+
- 在函数内声明变量时,使用`local`
244+
- 声明只读变量,使用`readonly`
245+
246+
`typeset``declare`命令一样。
247+
248+
3. 关于异常情况
249+
250+
有多种原因导致`declare`失败,关于这些情况可以参考[bash在线文档declare部分\(最新版\)](https://www.gnu.org/software/bash/manual/bash.html#index-declare),或执行 `info bash`
251+
查看`declare`部分最后一大串`an attempt is`开头的句子。
252+
253+
254+
255+
<!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ -->

0 commit comments

Comments
 (0)