declare 和 typeset 都是 Shell 内建命令,它们的用法相同,都用来设置变量的属性。不过 typeset 已经被弃用了,建议使用 declare 代替。
declare 命令的用法如下所示:declare [+/-] [aAfFgilprtux] [变量名=变量值]
其中,-
表示设置属性,+
表示取消属性,aAfFgilprtux
都是具体的选项,它们的含义如下表所示:
选项 | 含义 |
---|---|
-f [name] | 列出之前由用户在脚本中定义的函数名称和函数体。 |
-F [name] | 仅列出自定义函数名称。 |
-g name | 在 Shell 函数内部创建全局变量。 |
-p [name] | 显示指定变量的属性和值。 |
-a name | 声明变量为普通数组。 |
-A name | 声明变量为关联数组(支持索引下标为字符串)。 |
-i name | 将变量定义为整数型。 |
-r name[=value] | 将变量定义为只读(不可修改和删除),等价于 readonly name。 |
-x name[=value] | 将变量设置为环境变量,等价于 export name[=value]。 |
举栗 | 知识点 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-i 将变量定义为整数型 |
|
||||||||||||||||
-r 将变量定义为只读 (不可修改和删除) |
declare -r n=10 echo $n———>10 n=30———>报错 -bash: m: 只读变量 |
普通变量可以通过unset删除,但是只读变量不可修改不可删除 | |||||||||||||||
-p 显示指定变量的属性和值 |
roaddb@standalone:~$ declare -r r=10 roaddb@standalone:~$ declare -p r declare -r r="10" roaddb@standalone:~$ a=5 roaddb@standalone:~$ declare -p a declare -- a="5" |
||||||||||||||||
-x 将变量设置为环境变量 |
roaddb@standalone:~$ export env_var=test1 roaddb@standalone:~$ declare -x env_var2=test2 roaddb@standalone:~$ env|grep env_var* env_var2=test2 env_var=test1 roaddb@standalone:~$ declare -p env_var2 declare -x env_var2="test2" roaddb@standalone:~$ declare -p env_var declare -x env_var="test1" |
1.使用export或 declare -x可以设置环境变量 2.env可以查看所有的环境变量
|
|||||||||||||||
-f 列出之前由用户在脚本中定义的函数名称和函数体 | |||||||||||||||||
-F 仅列出自定义函数名称 | |||||||||||||||||
-g 在 Shell 函数内部创建全局变量 |
1.全局变量的知识点 1)在 Shell 中定义的变量,默认就是全局变量 2)全局变量的作用范围是当前的 Shell 进程,而不仅仅是当前的 Shell 脚本文件
|
||||||||||||||||
-a 声明变量为普通数组 |
roaddb@standalone:~$ arr1=('a' 'b' 'c') roaddb@standalone:~$ echo ${arr1[*]} a b c roaddb@standalone:~$ declare -p arr1 declare -a arr1='([0]="a" [1]="b" [2]="c")' roaddb@standalone:~$ declare -a arr2=('aa' 'bb' 'cc') roaddb@standalone:~$ echo ${arr2[*]} aa bb cc roaddb@standalone:~$ declare -p arr2 declare -a arr2='([0]="aa" [1]="bb" [2]="cc")' |
使用arr1=('a' 'b' 'c')或declare -a arr2=('a' 'b' 'c')的方式创建数组,其效果是一样的 | |||||||||||||||
-A 声明变量为关联数组(支持索引下标为字符串) |
roaddb@standalone:~$ declare -A arr3=(['aa']='bb' ['cc']='dd' ['ee']='ff') roaddb@standalone:~$ declare -p arr3 declare -A arr3='([aa]="bb" [ee]="ff" [cc]="dd" )' |