Linux使用shell数组

3.使用Shell数组
问题
本案例要求编写一个Shell脚本getips.sh,相关要求如下:
能够反复从键盘输入IP地址,保存到数组
当用户输入“EOF”后结束输入,显示数组IPADDS各元素的值
最后报告本次录入的IP地址个数、其中第1个录入的地址
方案
建立数组的方法:
格式1,整体赋值:数组名=(值1 值2 … … 值n)
格式2,单个元素赋值:数组名[下标]=值
查看数组元素的方法:
获取单个数组元素: [ ] {数组名[下标]} 获取所有数组元素: {数组名[@]}
获取数组元素个数:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[@]} 获取连续的多个…{数组名[@]:起始下标:元素个数}
获取某个数组元素的长度:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[下标]} 截取数组元素…{#数组名[下标]:起始下标:字符数}
步骤
实现此案例需要按照如下步骤进行。
步骤一:认识数组的赋值/引用基本方法
1)declare命令的使用
在Shell环境中,变量默认均作为字符串处理,当参与expr、 [ ] 使 1 + 2 X + 2 []数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“ 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 KaTeX parse error: Expected 'EOF', got '#' at position 40: …串 [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 KaTeX parse error: Expected 'EOF', got '#' at position 30: …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 KaTeX parse error: Expected '}', got '#' at position 2: {#̲WEB_SVRS[@]} 4 …IP" != “EOF” ]
do
IPADDS[ i ] = " i]=" IP" //每次录入赋值给不同的数组元素
let i++
done
echo “您已录入的IP地址如下:”
echo ${IPADDS[@]} //输出整个数组
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}” //输出第1个元素
[root@svr5 ~]# chmod +x getips.sh
3)验证、测试脚本
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):218.56.57.58
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 218.56.57.58 192.168.1.5 192.168.1.202 220.106.0.20
总共包括 6 个地址,
其中第1个IP地址是:192.168.4.77
4)遍历数组元素时分行显示
当数组元素的内容较多时,直接输出 KaTeX parse error: Expected 'EOF', got '#' at position 131: …: [root@svr5 ~]#̲ vim getips.sh …IP" != “EOF” ]
do
IPADDS[ i ] = " i]=" IP"
let i++
done
echo “您已录入的IP地址如下:”
#echo ${IPADDS[@]}
i=0 //控制下标增长的变量
while [ $i -lt ${#IPADDS[@]} ] //条件为下标小于元素个数
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {IPADDS[@]:i:4} //输出连续的四个元素
let i+=4 //下标自增4
done
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}”
验证脚本执行效果:
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):10.0.0.17
请添加IP地址(输EOF结束):10.0.0.27
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):202.110.79.81
请添加IP地址(输EOF结束):61.133.84.128
请添加IP地址(输EOF结束):61.133.84.72
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 192.168.1.5 192.168.1.202
10.0.0.17 10.0.0.27 220.106.0.20 202.110.79.81
61.133.84.128 61.133.84.72
总共包括 10 个地址,
其中第1个IP地址是:192.168.4.77

发布了121 篇原创文章 · 获赞 69 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/iT__SuperMan/article/details/90648982
今日推荐