Linux declare命令使用详解
Shell declare命令用于声明和显示已存在的shell变量。当不提供变量名参数时显示所有shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。declare的功能与typeset命令的功能是相同的。
语法
1 | declare [-aAfFgilnrtux] [-p] [name[=value] ...] |
主要用途
- 显示包含指定属性的全部变量和值
- 显示包含指定属性的一到多个变量和值
- 显示一到多个变量的属性和值
- 显示所有变量的属性和值并显示函数的定义
- 显示所有变量的属性和值
- 显示所有全局变量的属性和值
- 显示全部函数名和函数定义
- 只显示全部函数名
- 显示一到多个函数名和函数定义
- 只显示一到多个函数名
- 声明全局变量(可选:赋值)
- 声明变量(可选:赋值、属性)
- 增加、删除变量的属性(可选:赋值)
选项
1 | -f 将操作或显示限制为函数名及函数定义。 |
参数
shell变量:声明shell变量,格式为“变量名=值”。
返回值
declare 返回true除非你提供了非法选项或赋值错误。
实例
1 | # 显示所有包含整型属性的变量和值。 |
1 | # 定义函数内的全局变量 |
1 | # 显示所有变量的属性和值并显示函数的定义,输出很长。 |
1 | # 显示全部函数名和函数定义。 |
声明整数型变量
# declare -i ab //声明整数型变量
# ab=56 //改变变量内容
# echo $ab //显示变量内容
56
改变变量属性
# declare -i ef //声明整数型变量
# ef=1 //变量赋值(整数值)
# echo $ef //显示变量内容
1
# ef="wer" //变量赋值(文本值)
# echo $ef
0
# declare +i ef //取消变量属性
# ef="wer"
# echo $ef
wer
设置变量只读
# declare -r ab //设置变量为只读
# ab=88 //改变变量内容
-bash: ab: 只读变量
# echo $ab //显示变量内容
56
声明数组变量
# declare -a cd='([0]="a" [1]="b" [2]="c")' //声明数组变量
# echo ${cd[1]}
b //显示变量内容
# echo ${cd[@]} //显示整个数组变量内容
a b c
显示函数
# declare -f
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- $1;
return $?;
else
if [ -x /usr/share/command-not-found ]; then
/usr/bin/python /usr/share/command-not-found -- $1;
return $?;
else
return 127;
fi;
fi
}
讨论
全局和局部变量
正如上面例子指出的情况,我们在日常编写程序的时候需要了解这些概念,在这里做个简要地介绍,当然你也可以很方便的搜索到相关内容。
- 全局变量:在整个脚本执行期间,只要没有被删除就一直存在。
- 局部变量:在函数内定义,函数执行后就被删除。
建议函数内使用
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’命令的例子部分。