第四章 数组
1,数组的基本概念
数组中有限个相同类型的变量用一个名字命名,然后用编号区分。
用于区分不同元素的编号称为数组下标,数组中的元素称为下标变量。
2,数组的类型
数组分为普通数组和关联数组。普通数组中的索引(下标)都是整数。关联数组的数组索引可以用任意文本。关
联数组使用前要声明,两者最大的区别是,关联数组是由特定格式的键值对组成。
普通数组
数组元素的索引(下标)从0开始,获取数组中的元素要利用索引(下标)。索引(下标)可以是算术表达式,其结果必须是整数。
关联数组
使用:先声明,再定义,后引用
关联数组的索引(下标)可以是任意的整数和字符串。
定义数组的类型
#声明普通数组(加-a是为了显式声明):
declare -a array
#声明关联数组:
declare -A array
3,数组的定义
先给数组命名,后定义数组的值
直接定义
用小括号将变量值括起来赋值给数组变量,每个变量值之间用空格进行分割。
array_name=(value1 ualue2...)
数组名=(变量值1 变量值2...)
#引用格式
echo ${array_name}
下标定义
用小括号将变量值括起来,同时采用键值对的形式赋值。
array_name=([1]=value1 [2]=value2...)
#小括号里面对应的数字为数组下标,等号后面的内容为下标对应的数组变量的值。
间接定义
分别通过定义数组的方法来定义。
array_name[0]=value1;array_name[1]=value2;array_name[2]=value3;
#数组名[下标]=变量值
从文件中读入定义
使用命令的输出结果作为数组的内容
array_name=($(命令))
#数组名=($(`变量值`))
或者
array_name=($(命令))
#数组名=(`变量值`)
4,数组的遍历及赋值
通过for循环和while循环实现,先定义好数组再通过循环批量打印出数组元素
常见的访问数组表达式
while循环实现shell数组的遍历
#/uer/bin/bash
while read line
do
hosts[++i]=$line
done </etc/hosts
echo "hosts first: ${hosts[1]}"
echo
for i in ${!hosts[@]}
do
echo "$i: ${hosts[i]}"
done
for循环实现shell数组遍历
#!/usr/bin/bash
#for array
OLD_IFS=$IFS #for 循环默认以tab 空格和回车为分割符,提前定>义变量以行为分隔符
IFS=$'\n'
for line in `cat /etc/hosts`
do
hosts[++j]=$line
done
for i in ${!hosts[@]}
do
echo "$i: ${hosts[i]}"
done
IFS=OLD_IFS
数组的赋值
#通过“数组名[下标]”对数组进行引用赋值,如果下标不存在,则自动添加一个新的数组元素,如果存在,则覆盖原来的值。
$array_name[index1]=value1
$array_name[index2]=value2
#数组名[下标]=变量值
[root@tianyun ~]# array=("tom" "lucy" "alice")
[roo@tianyun ~ ]# echo $(array[*])
tom lucy alice
[root@tianyun ~ ]# echo ${array[2]}
alice
[root@tianyun ~ ]# array[2]=lily #修改数组元素
[root@tianyun ~ ]# echo ${array[2]}
lily
数组的删除
#“unset 数组[下标]”删除相应数组元素,如果不带下标,则表示删除整个数组的所有元素。
[root@tianyun ~ ]# echo $(array[*])
tom lucy alice
[root@tianyun ~ ]# unset array[1] #删除下标为1的数组元素
[root@tianyun ~ ]# echo ${array[*]}
tom alice #打印所有后,lucy已被删除
[root@tianyun ~ ]# unset array #删除整个数组
[root@tianyun ~ ]# echo $(array[*])
输出为空
数组的截取和替换
#通过${数组名[@或*]:起始位置:长度}切片原先数组。
#返回的是字符串,中间用空格分开。如果加上(),就可以得到切片数组
[root@localhost ~]# array=(1 2 3 4 5 6 7 8)
[root@localhost ~]# echo ${array[*]:0:3}
1 2 3
[root@localhost ~]# echo ${array[*]:1:4}
2 3 4 5
[root@localhost ~]# c=(${array[*]:1:4}) #c就是一个新数组
[root@localhost ~]# echo ${#c[*]}
4
[root@localhost ~]# echo ${c[*]}
2 3 4 5
#替换的语句:
${数组名[*或@]/查找字符/替换字符}
[root@localhost ~]# array=(1 2 3 4 5 6 7 8)
[root@localhost ~]# echo ${array[*]/3/100}
1 2 100 4 5 6 7 8
[root@localhost ~]# echo ${array[*]}
1 2 3 4 5 6 7 8
[root@localhost ~]# a=(${array[*]/3/100})
[root@localhost ~]# echo ${a[*]}
1 2 100 4 5 6 7 8
5,数组脚本实战
array数组实现性别统计
`通过数组索引遍历元素,把要统计的对象作为数组的索引。`使用循环结合数组统计性别出现的次数
1,#创建性别文件
[root@localhost script]# cat sex.txt
jack m
alice f
tom m
rose f
robin m
zhuzhu f
2,#使用while循环对文本逐行处理
[root@localhost script]# cat sex.sh
#!/bin/bash
declare -A sex #声明为关联数组
#先完成数组赋值
while read line
do
type=`echo $line |awk '{print $2}'` #取文件的第二列
let sex[$type]++ #以性别作为索引,统计索引的个数
done < sex.txt
#再完成数组遍历
for i in ${!sex[@]}
do
echo "$i:${sex[$i]}" #统计性别个数
done
[root@localhost script]# chmod a+x sex.sh
array数组统计不同类型shell的数量
`对/etc/Dasswd文件不同Shell 类型进行统计,`
[root@localhost script]# cat shell.sh
#!/bin/bash
declare -A shell #声明为关联数组
#先完成数组赋值
while read line
do
type=`echo $line |awk -F":" '{print $NF}'` #取文件的第二列
let shell[$type]++ #以性别作为索引,统计索引的个数
done </etc/passwd
#再完成数组遍历
for i in ${!shell[@]}
do
echo "$i:${shell[$i]}" #统计性别个数
done