数组操作
1,数组介绍
相通数据类型放在一起,方便操作;程序会变得更清晰
2,如何使用数组
1)普通数组:declare -a
- 定义:
方式一
#可加整型数 浮点数 字符,直接定义默认定义普通数组
[root@m01~]# declare -a web_ip=(172.16.1.1 172.16.1.2 172.16.1.3)
[root@m01~]# declare -a array=("abc" 111 1.3)
[root@m01~]# array1=(a b 3)
# 查看
root@m01~]# declare -a
declare -a array='([0]="abc" [1]="111" [2]="1.3")'
declare -a array1='([0]="a" [1]="b" [2]="3")'
declare -a web_ip='([0]="172.16.1.1" [1]="172.16.1.2" [2]="172.16.1.3")'
方式二
[root@m01~]# declare -a ips
[root@m01~]# ips[0]=111
[root@m01~]# ips[1]=222
[root@m01~]# declare -a | grep ips
declare -a ips='([0]="111" [1]="222")'
方式三
[root@m01~]# app=([0]=333 [2]=444)
[root@m01~]# declare -a | grep app
declare -a app='([0]="333" [2]="444")'
- 取值
# 支持正向取值 也支持负向取值
[root@m01~]# echo ${app[0]}
333
[root@m01~]# echo ${app[-1]}
444
2)关联数组:declare -A
- 定义
# 支持字符 也序号数字
[root@m01~]# declare -A excel=([name]=zxx [age]=18 [hobby]=sing)
[root@m01~]# declare -A abc=([0]=www [age]=18)
root@m01~]# declare -A
declare -A abc='([age]="18" [0]="www" )'
declare -A excel='([hobby]="sing" [name]="zxx" [age]="18" )'
- 取值
[root@m01~]# echo ${excel["age"]}
18
3,访问数组内元素
- 取值
# 取出所有值
[root@m01~]# declare -A y=([a1]=12 [a2]=13 [a3]=14)
[root@m01~]# echo ${y[*]}
14 13 12
#只取出索引
[root@m01~]# echo ${!y[*]}
a3 a2 a1
#获取数组元素的长度
[root@m01~]# echo ${#y[*]}
3
- 修改/添加数组元素
[root@m01~]# declare -A x=([1]=a [2]=b [c]=c)
[root@m01~]# echo ${x[*]}
c a b
#添加数组元素
[root@m01~]# x[0]=p
[root@m01~]# echo ${x[*]}
c p a b
#已存在的即修改
[root@m01~]# x[0]=2
[root@m01~]# echo ${x[*]}
c 2 a b
- 删除数组元素
[root@m01~]# echo ${x[*]}
c 2 a b
# 删除数组元素
[root@m01~]# unset x[2]
[root@m01~]# echo ${x[*]}
c 2 a
#删除数组
[root@m01~]# unset x
[root@m01~]# echo ${x[*]}
=================
[root@m01~]# line=(one two thre thae toe six)
[root@m01~]# echo ${line[*]}
one two thre thae toe six
#删除指定元素
[root@m01~]# echo ${line[*]#six}
one two thre thae toe
#删除同一特性的元素
[root@m01~]# echo ${line[*]#t*e}
one two six
[root@m01~]# for i in `echo ${line[*]}`;do echo $i;done
one
two
thre
thae
toe
six
- 数组内元素的截取
[root@m01~]# echo ${line[*]}
one two thre thae toe six
#截取去掉第一个元素的值
[root@m01~]# echo ${line[*]:1}
two thre thae toe six
#截取去掉第一个元素后的三个值
[root@m01~]# echo ${line[*]:1:3}
two thre thae
- 元素的替换
[root@m01~]# echo ${line[*]}
one two thre thae toe six
# 把one替换成onee(只能临时替换)
[root@m01~]# echo ${line[*]/one/onee}
onee two thre thae toe six
# 后面不加内容,即删除(只能临时替换)
[root@m01~]# echo ${line[*]/one/}
two thre thae toe six
4,遍历数组
1, 普通数据遍历
第一种方式
[root@m01~]# zx=(111 222 333 444 555)
[root@m01~]# echo ${zx[*]}
111 222 333 444 555
[root@m01~]# for ((i=0;i<5;i++));do echo ${zx[$i]};done
111
222
333
444
555
第二种方式
[root@m01~]# for ((i=0;i<${#zx[*]};i++));do echo ${zx[$i]};done
111
222
333
444
555
2,通用数据遍历
--取出值及索引
[root@m01~]# vim /script/zx1.sh
#!/bin/bash
declare -A zx1=([name]="zx" [age]=16 [hobby]="sing")
for iterm in ${zx1[*]}
do
echo $iterm
done
echo ==========
for i in ${!zx1[*]}
do
echo $i
done
[root@m01~]# chmod +x /script/zx1.sh
[root@m01~]# /script/zx1.sh
sing
zx
16
==========
hobby
name
age
示例1:
#列出/etc文件中最后一行及数量
[root@m01~]# vim /script/zx2.sh
#!/bin/bash
declare -A array
while read line
do
let array[`echo $line | cut -d: -f7`]++
done</etc/passwd
declare -A | grep array
等同于
#!/bin/bash
declare -A array
while read line
do
arr=`echo $line | cut -d: -f7`
let array["$arr"]++
done</etc/passwd
declare -A | grep array
[root@m01~]# /script/zx2.sh
declare -A array='([/sbin/nologin]="22" [/bin/sync]="1" [/bin/bash]="2" [/sbin/shutdown]="1" [/sbin/halt]="1" )'
示例2:
[root@m01~]# vim /script/zx3.sh
#!/bin/bash
array=(
10.0.0.7
10.0.0.8
10.0.0.9
)
for info in ${array[*]}
do
ping -c 2 -w 1 $info
done
[root@m01~]# chmod +x /script/zx3.sh
[root@m01~]# /script/zx3.sh
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=0.656 ms
--- 10.0.0.7 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.656/0.656/0.656/0.000 ms
PING 10.0.0.8 (10.0.0.8) 56(84) bytes of data.
--- 10.0.0.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data.
--- 10.0.0.9 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
网友评论