第四章 数组

第四章 数组

1,数组的基本概念

数组中有限个相同类型的变量用一个名字命名,然后用编号区分。

用于区分不同元素的编号称为数组下标,数组中的元素称为下标变量

2,数组的类型

数组分为普通数组和关联数组。普通数组中的索引(下标)都是整数。关联数组的数组索引可以用任意文本。关

联数组使用前要声明,两者最大的区别是,关联数组是由特定格式的键值对组成。

普通数组

数组元素的索引(下标)从0开始,获取数组中的元素要利用索引(下标)。索引(下标)可以是算术表达式,其结果必须是整数。

image.png

关联数组

使用:先声明,再定义,后引用

关联数组的索引(下标)可以是任意的整数和字符串。

image.png

定义数组的类型

#声明普通数组(加-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循环实现,先定义好数组再通过循环批量打印出数组元素

常见的访问数组表达式

image.png

image.png

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
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值