shell编程之 认识数组的赋值/引用基本方法

1)declare命令的使用
在Shell环境中,变量默认均作为字符串处理,当参与expr、 [ ] 数 学 运 算 时 自 动 作 为 整 数 处 理 。 比 如 , 使 用 “ 1 + 2 ” 、 “ X + 2 ” 、 “ []数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“ []使1+2X+2X+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.com" [1]="mail.tarena.com" [2]="club.tarena.com")'
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.com"  		//为第1个元素赋值
[root@svr5 ~]# WEB_SVRS[1]="mail.tarena.com"  		//为第2个元素赋值
[root@svr5 ~]# WEB_SVRS[2]="club.tarena.com"  		//为第3个元素赋值
[root@svr5 ~]# set | grep "WEB_"  				//查看数组定义
WEB_SVRS=([0]="www.tarena.com" [1]="mail.tarena.com" 
[2]="club.tarena.com")

为数组元素赋值时,并不要求每个成员都需要指定,下标也可以不连续。比如,可跳过下标3,直接为下标为4的元素赋值:

[root@svr5 ~]# WEB_SVRS[4]="tts6.tarena.com"
[root@svr5 ~]# set | grep "WEB_"  				//确认设置结果
WEB_SVRS=([0]="www.tarena.com" [1]="mail.tarena.com" [2]="club.tarena.com" [4]="tts6.tarena.com")

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

你可能感兴趣的:(Linux)