declare
声明变量,设置或显示变量的值和属性。
语法
1declare [-aAfFgilnrtux] [-p] [name[=value] ...]
主要用途
- 显示包含指定属性的全部变量和值
- 显示包含指定属性的一到多个变量和值
- 显示一到多个变量的属性和值
- 显示所有变量的属性和值并显示函数的定义
- 显示所有变量的属性和值
- 显示所有全局变量的属性和值
- 显示全部函数名和函数定义
- 只显示全部函数名
- 显示一到多个函数名和函数定义
- 只显示一到多个函数名
- 声明全局变量(可选:赋值)
- 声明变量(可选:赋值、属性)
- 增加、删除变量的属性(可选:赋值)
选项
1-f 将操作或显示限制为函数名及函数定义。
2-F 只显示函数名(调试时附加行号和源文件)。
3-g 在shell函数中使用时创建全局变量;其他情况下忽略。
4-p 显示每个名称的属性和值。
5
6*设置属性的选项:
7-a 创建数组(如果支持)。
8-A 创建关联数组(如果支持)。
9-i 增加整型属性。
10+i 删除整型属性。
11-l 增加小写属性,变量的值将转换为小写。
12+l 删除小写属性。
13-n 增加引用属性(如果该选项存在)。
14+n 删除引用属性(如果该选项存在)。
15-r 增加只读属性。
16-t 增加追踪属性。
17+t 删除追踪属性。
18-u 增加大写属性,变量的值将转换为大写。
19+u 删除大写属性。
20-x 增加导出属性。
21+x 删除导出属性。
参数
1name(可选):变量名或函数名。
2value(可选):变量的值。
返回值
declare 返回true除非你提供了非法选项或赋值错误。具体导致异常的情况请查看讨论章节的关于异常情况。
例子
1# 声明变量,当然也欢迎您在这个网站(感谢本项目发起人 @jaywcjlove)查询linux命令。
2declare reference_website='https://wangchujiang.com/linux-command/'
3
4# 显示所有包含整型属性的变量和值。
5declare -i
6# 定义变量b并赋值为3,具有整型属性。
7declare -i b=5
8# 显示属性,返回 declare -i b="5"。
9declare -p b
10# 删除整型属性。
11declare +i b
12# 显示属性,返回 declare -- b="5"。
13declare -p b
14# 根据变量属性强制转换值的英文大小写。
15declare -u uc_var='abc'
16declare -l lc_var='ABC'
17# 显示'ABC abc';
18echo "${uc_var} ${lc_var}"
1# 定义函数内的全局变量
2function test(){
3 declare -g a=3
4 # 或者
5 local -g b=3
6 # 或者
7 c=3
8 # 让我们查看它们的属性。
9 declare -p a b c
10}
11# 执行函数。
12test
13# 返回结果。
14# declare -- a="3"
15# declare -- b="3"
16# declare -- c="3"
17
18# 定义函数外的全局变量
19declare a=3
20b=3
21declare –p a b
22# 返回结果如下。
23# declare -- a="3"
24# declare -- b="3"
25
26# 定义局部变量
27function test2(){
28 local -i a=3
29 declare -i b=3
30}
31test2
32# 没有该变量(已经被销毁了)
33echo "${a} ${b}"
34# 因此,我们日常脚本中最常见的类似于'a=3'实际上是声明并赋值了一个全局变量。
35# 在接下来的 **讨论** 环节会延伸讨论全局和局部变量问题。
1# 注意,不能使用 `+a` 或 `+A` 取消数组,也不能使用 `+r` 取消只读属性。
2
3# 定义只读数组,设置属性的同时定义赋值。
4declare -ar season=('Spring' 'Summer' 'Autumn' 'Winter')
5# 或者这样。
6season=('Spring' 'Summer' 'Autumn' 'Winter')
7declare -ar season
8# 显示所有数组。
9declare -a
10# 定义关联数组。
11
12declare -A fruits=(['apple']='red' ['banana']='yellow')
13# 显示所有关联数组。
14declare -A
1# 显示所有变量的属性和值并显示函数的定义,输出很长。
2declare
3# 显示所有变量的属性和值。
4declare -p
5# 显示所有全局变量的属性和值。
6declare -g
1# 显示全部函数名和函数定义。
2declare -f
3# 只显示全部函数名。
4declare -F
5
6# 定义两个函数。
7function func_a(){ echo $(date +"%F %T"); }
8function func_b(){ cd /; ls -lh --sort=time; }
9# 显示一到多个函数名和函数定义。
10declare -f func_a func_b
11# 只显示一到多个函数名,验证某个名称是否已经定义为函数时有用。
12declare -F func_a func_b
13# 最好不要让函数名和变量名相同。
讨论
-
全局和局部变量
正如上面例子指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里 做个简要地介绍,当然你也可以很方便的搜索到相关内容。
- 全局变量:在整个脚本执行期间,只要没有被删除就一直存在。
- 局部变量:在函数内定义,函数执行后就被删除。
建议函数内使用
local
命令,函数外使用declare
命令。不要在脚本中定义过多的全局变量,那样可能会被其他函数调用造成意料之外的后果,并且也不方便检查出来。
更不用说缺乏必要的注释了 —— ZhuangZhu-74
相关资料:
-
关于
declare
typeset
export
local
readonly
命令为什么
declare
能做到的事,还需要定义其他这些命令呢?因为这样语句含义会更加明确,例如:
- 设置导出属性的变量时,
export var
和declare -x var
。 - 在函数内声明变量时,使用
local
。 - 声明只读变量,使用
readonly
。
typeset
和declare
命令一样。 - 设置导出属性的变量时,
-
关于异常情况
有多种原因导致
declare
失败,关于这些情况可以参考bash在线文档declare部分(最新版),或执行info bash
查看declare
部分最后一大串an attempt is
开头的句子。
注意
- 该命令是bash内建命令,相关的帮助信息请查看
help
命令。 - 导出属性的相关介绍请查看'export'命令。
- 只读属性的相关介绍请查看'readonly'命令。
- 引用属性的相关介绍请查看'unset'命令的例子部分。
来源:https://github.com/jaywcjlove/linux-command
最后修改于: Wednesday, January 31, 2024
版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。