shell编程之认识数组的赋值引⽤基本⽅法
1)declare命令的使⽤
[]数学运算时⾃动作为整数处理。⽐如,使⽤“1+2”、“X+2”、“在Shell环境中,变量默认均作为字符串处理,当参与expr、
X+2”表达式是⽆法将运算结果直接作为整数赋值给指定的变量的:
[root@svr5 ~]# X=24
[root@svr5 ~]# A=1+2
[root@svr5 ~]# echo $A
1+2 //赋值结果为字符串
[root@svr5 ~]# A=X+2
[root@svr5 ~]# echo $A
X+2 //赋值结果为字符串
[root@svr5 ~]# A=$X+2
[root@svr5 ~]# echo $A
24+2 //赋值结果为字符串
上述操作中,变量A均作为字符串处理。
若要将⼀个变量强制设置为整数,可以使⽤declare命令声明(-i选项):
[root@svr5 ~]# declare -i A //先将A声明为整数变量
[root@svr5 ~]# A=1+2 //然后赋值
[root@svr5 ~]# echo $A //确认结果
3
[root@svr5 ~]# declare -i B=$X+2 //也可以在声明的同时进⾏赋值
[root@svr5 ~]# echo $B
26
declare命令结合-x选项,可以将局部变量设置为全局变量,这个与export命令的作⽤差不多:
[root@svr5 ~]# declare -x NM="Tarena" //新建全局变量NM
[root@svr5 ~]# bash //进⼊⼦Shell环境
[root@svr5 ~]# echo $NM //验证全局变量
Tarena
[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
如果要取消变量的全局属性,可以使⽤“+x”选项:
[root@svr5 ~]# declare +x NM //将NM恢复为局部变量
[root@svr5 ~]# bash //进⼊⼦Shell环境
[root@svr5 ~]# echo $NM //检查已⽆法调⽤NM变量
[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
declare命令结合-r选项,可以为变量设置“只读”属性,只读变量的值不允许再被修改,通常可⽤来保存⼀些固定的参数,避免⽆意中被修改:
[root@svr5 ~]# echo $NM
Tarena
[root@svr5 ~]# declare -r NM //将变量NM设置为只读
[root@svr5 ~]# NM="Tarena IT Group." //重新赋值失败
-bash: NM: readonly variable
[root@svr5 ~]# echo $NM //查看还是原来的值
Tarena
只读变量除了不能修改值以外,也⽆法被unset清除(若要清除只读变量,需要退出当前Shell程序):
[root@svr5 ~]# unset NM
怎么给数组赋值-bash: unset: NM: cannot unset: readonly variable
[root@svr5 ~]# echo $NM
Tarena
2)定义/赋值数组
使⽤declare命令,结合-a选项可声明⼀个数组(这个操作⼀般可不做),⽐如:
[root@svr5 ~]# declare -a SVRS
直接执⾏declare -a,即不指定数组名参数时,会列出当前Shell环境中已定义的所有数组设置:
[root@svr5 ~]# declare -a //查看已定义的数组
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FQDNS='([0]="www.tarena" [1]="mail.tarena" [2]="club.tarena")'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0" [1]="0")'
declare -a SVRS='([0]="www" [1]="ftp" [2]="mail" [3]="club")'
若要定义数组的成员,可以在declare声明时定义,也可以直接整体定义。整体赋值的格式为“数组名=(值1 值2 值3 … …)”,⽐如:
[root@svr5 ~]# MY_SVRS=(www ftp mail club)
[root@svr5 ~]# set | grep "MY_" //查看数组定义结果
MY_SVRS=([0]="www" [1]="ftp" [2]="mail" [3]="club")
Shell中的语法要求是⽐较松散的,所以我们也可以直接为单个数组元素赋值,格式为“数组名[下标]=值”,每个数组元素的编号(即下标)从0开始。⽐如,以下操作会产⽣⼀个包括3个元素的数组:
[root@svr5 ~]# WEB_SVRS[0]="www.tarena" //为第1个元素赋值
[root@svr5 ~]# WEB_SVRS[1]="mail.tarena" //为第2个元素赋值
[root@svr5 ~]# WEB_SVRS[2]="club.tarena" //为第3个元素赋值
[root@svr5 ~]# set | grep "WEB_" //查看数组定义
WEB_SVRS=([0]="www.tarena" [1]="mail.tarena"
[2]="club.tarena")
为数组元素赋值时,并不要求每个成员都需要指定,下标也可以不连续。⽐如,可跳过下标3,直接为下标为4的元素赋值:
[root@svr5 ~]# WEB_SVRS[4]="tts6.tarena"
[root@svr5 ~]# set | grep "WEB_" //确认设置结果
WEB_SVRS=([0]="www.tarena" [1]="mail.tarena" [2]="club.tarena" [4]="tts6.tarena")
3)查看数组、查看数组元素
输出整个数组的内容:
[root@svr5 ~]# echo ${MY_SVRS[@]}
www ftp mail club
查看第1个(下标为0的)数组元素:
[root@svr5 ~]# echo ${MY_SVRS[0]}
www
或者
[root@svr5 ~]# echo ${MY_SVRS} //省略下标时,默认视为0
www
输出下标为2的数组元素:
[root@svr5 ~]# echo ${MY_SVRS[2]}
mail
输出数组中下标从1开始的2个元素:
[root@svr5 ~]# echo ${MY_SVRS[@]:1:2}
ftp mail
查看数组的元素个数:
[root@svr5 ~]# echo ${#MY_SVRS[@]} 4
[root@svr5 ~]# echo ${#WEB_SVRS[@]} 4
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论