命令描述
declare或typeset内建命令(它们是完全相同的)可以用来限定(或宣告变量的属性)变量的属性.这是在某些编程语言中使用的定义类型不严格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh脚本中运行。
declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性只读,整数运算,环境变量),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部shell变量与函数(与执行set指令的效果相同)。
无论是环境变量还是自定义变量,在使用、变量=变量内容、export 变量=变量内容、亦或是 declare -x 变量=变量内容,在退出系统后,再次登陆时,所设置的变量将消失.
在默认的情况下,bash对于变量有几个基本的定义:
1、变量类型默认为“字符串”就像sum=100+200+300,所以若不指定变量类型,者100+200+300为一个“字符串”而不是计算式
2、bash环境中的数值运算,默认最多仅能到达整数类型,所以1/3结果是零(只能做整数运算)。
命令语法
declare [+/-][rxi][变量名称=设置值]或declare -f
参数
+/-:-可用来指定变量的属性,+则是取消变量所设置的属性。
-f:仅显示函数。
-a:将后面的variable定义为数组(array)
-r:将变量设置为只读readonly,该变量不可被更改内容,也不能unset
-x:指定的变量会成为环境变量,可供shell以外的程序来使用,用法与export一样,就是将后面的variable变成环境变量
-i:[设置值]可以是数值,字符串或运算式,将后面的variable定义为整数数字(integer)
-p:可以单独列出变量的属性类型
1、参数-i的使用
点击(此处)折叠或打开
[root@RHEL6 ~]#sum=100+300+50
[root@RHEL6 ~]# echo$sum
100+300+50 //怎么没有帮助我们计算?因为这是文字类型的变量属性(默认是文字类型的变量属性,加-i属性为整数运行类型,如果不能整数运算结果将是0)
[root@RHEL6 ~]#declare-i sum=100+300+50
[root@RHEL6 ~]# echo$sum
450
[root@RHEL6 ~]#declare-i sum=100+300-50
[root@RHEL6 ~]# echo$sum
350
[root@RHEL6 ~]#declare-i sum=(100+300)/50
[root@RHEL6 ~]# echo$sum
8
[root@RHEL6 ~]#
[root@RHEL6 ~]#declare-i sum=1/3
[root@RHEL6 ~]# echo$sum
0
[root@RHEL6 ~]#
因为变量sum不是整数变量,所以不会自动对表达式求值。也可以采用下面两个方式,运算数值结果,只是没有变量属性,属性值均为“空”
点击(此处)折叠或打开
[root@RHEL6~]#unset sum
[root@RHEL6~]#declare-p sum
-bash:declare:sum: notfound
[root@RHEL6~]#
[root@RHEL6~]#sum=$[100+300+50]
[root@RHEL6~]#declare-p sum
declare--sum="450"
[root@RHEL6~]#sum=$((100+300+50))
[root@RHEL6~]#declare-p sum
declare--sum="450"
[root@RHEL6~]#
2、参数-x的使用
点击(此处)折叠或打开
declare-x HISTSIZE="1000"命令与 export HISTSIZE="1000"是相同的,设置变量并将变量转换为环境变量
[root@RHEL6~]#HISTSIZE=1000//设置自定义变量HISTSIZE变量的内容为1000
[root@RHEL6~]# set |grep HISTSIZE//查找HISTSIZE变量
HISTSIZE=1000
[root@RHEL6~]#declare-x HISTSIZE="1001" //使用declare-x设置环境变量HISTSIZE的内容为1001,其实是覆盖了自定义变量HISTSIZE,并且HISTSIZE也同时变成了环境变量
[root@RHEL6~]# set |grep HISTSIZE//查询HISTSIZE变量内容的变化
HISTSIZE=1001
_=HISTSIZE=1001
[root@RHEL6~]#export HISTSIZE="1002" //使用export 设置环境变量HISTSIZE的内容为1002,其实是覆盖了由declare-x设置的变量HISTSIZE。
[root@RHEL6~]# set |grep HISTSIZE//查询HISTSZE变量内容的变化
HISTSIZE=1002
_=HISTSIZE
[root@RHEL6~]#
点击(此处)折叠或打开
[root@RHEL6~]#env|grep HISTSIZE//查看HISTSIZE环境变量、系统默认是1000
HISTSIZE=1000//变量值为1000
[root@RHEL6~]#unset HISTSIZE//取消变量
[root@RHEL6~]#env|grep HISTSIZE//再次查询HISTSIZE变量,发现已经没有了
[root@RHEL6~]#HISTSIZE="1000" //重新设置变量HISTSIZE的内容为1000
[root@RHEL6~]#env|grep HISTSIZE//在次查询HISTSIZE变量,发现env中并没有HISTSIZE变量,原来默认情况下HISTSIZE="1000"只是设置为自定义变量,而非环境变量,当然使用env查看环境变量的命令也就无法查到了。
[root@RHEL6~]# set |grep HISTSIZE//在set中查找HISTSIZE变量,发现以存在,原因是set命令是查找环境变量和自定义变量的命令
HISTSIZE=1000
[root@RHEL6~]#export HISTSIZE//将HISTSIZE变量使用export转化为环境变量
[root@RHEL6~]#env|grep HISTSIZE//再次查找,发现查找到内容
HISTSIZE=1000
3、参数-x -i合用
点击(此处)折叠或打开
[root@RHEL6~]#declare-ix sum=100+200+300//设置sum为环境变量并且可以是数值运算
[root@RHEL6~]#echo $sum//显示变量结果
600
[root@RHEL6~]#env|grep sum//在环境变量下查找sum变量
sum=600
[root@RHEL6~]#
4、参数-r的使用(readonly属性)
点击(此处)折叠或打开
[root@RHEL6 ~]#set|grep sum //查询是否有sum变量,发现没有,那么我们设置
[root@RHEL6 ~]#declare-xi sum=100+200+300 //设置sum为环境变量并且可以是数值运算
[root@RHEL6 ~]# echo$sum //显示变量结果
600
[root@RHEL6 ~]#env|grep sum //同样在环境变量中也能查看到sum变量
sum=600
[root@RHEL6 ~]#declare-r sum //设置sum为只读属性的变量
[root@RHEL6 ~]#declare-p sum //-p可以单独列出变量的属性类型
declare-irx sum="600"//属性为-irx,如果将变量设置为“只读”,通常得要注销在登录才能复原该变量的类型了。
[root@RHEL6 ~]#sum=111 //更改sum变量内容,发现sum为自读变量
-bash:sum:readonly variable
[root@RHEL6 ~]#unset sum //取消变量sum,发现也无法取消
-bash:unset:sum:cannot unset:readonly variable
[root@RHEL6 ~]#declare+r sum //使用+参数取消r参数,发现也无法取消,(注销系统可以取消变量的只读属性)
-bash:declare:sum:readonly variable
[root@RHEL6 ~]#
5、参数+-的使用,相反的-号赋予某属性,而+号是取消某属性,属性有[rix]三种
点击(此处)折叠或打开
[root@RHEL6~]#declare-ix sum=100+200+400//直接设置成环境变量
[root@RHEL6~]#echo $sum
700
[root@RHEL6~]#declare-p sum//查看变量属性为-ix
declare-ix sum="700"
[root@RHEL6~]#declare+x sum//取消x属性
[root@RHEL6~]#declare-p sum//查看变量属性为-i
declare-i sum="700"
[root@RHEL6~]#env|grep sum//同样在环境变量中也查不到sum变量了因为他取消了-x属性
[root@RHEL6~]#declare-x sum//赋予x属性
[root@RHEL6~]#env|grep sum//env中可以查看到sum变量了。
sum=700
6、数组(array)变量类型即-a参数
声明数组变量(实际上,任何变量都可以当做数组来操作)数组(array)对写数值程序的程序员来说,可是不能错过学习的重点之一。那么如何设置数组的变量与内容呢?bash里头,数组的设置方式是:
var[index]=content //意思是说我有一个数组名为var,而这个数组内容为var[1]="small min",var[2]="big min",var[3]="nice min"等等,那个index就是一个数字,重点是[]来设置的。目前bash提供的是一维数组。
点击(此处)折叠或打开
[root@awake~]#names=Jack
[root@awake~]#names[1]=Bone
[root@awake~]#names[2]=Awake
[root@awake~]#echo $names//直接引用names,相当于引用names[0]
Jack
[root@awake~]#echo ${names[*]}
Jack Bone Awake
[root@awake~]#declare-p names//查看变量属性及内容
declare-a names='([0]="Jack" [1]="Bone" [2]="Awake")'
[root@awake~]#echo"${names},${names[1]},${names[2]}" //查看变量内容
Jack,Bone,Awake
[root@awake~]#