206 lines
4.6 KiB
Markdown
206 lines
4.6 KiB
Markdown
|
<h1><center>shell数组</center></h1>
|
|||
|
|
|||
|
作者:行癫(盗版必究)
|
|||
|
|
|||
|
------
|
|||
|
|
|||
|
## 一:数组
|
|||
|
|
|||
|
#### 1.数组介绍
|
|||
|
|
|||
|
是若干数据的集合,其中的每一份数据都称为元素
|
|||
|
|
|||
|
shell不限制数组的大小,理论上可以存放无限量的数据
|
|||
|
|
|||
|
#### 2.数组分类
|
|||
|
|
|||
|
普通数组
|
|||
|
|
|||
|
只能使用整数作为数组索引/下标(从0开始)
|
|||
|
|
|||
|
关联数组
|
|||
|
|
|||
|
可以使用字符串作为数组索引/下标
|
|||
|
|
|||
|
#### 3.定义数组
|
|||
|
|
|||
|
##### 普通数组
|
|||
|
|
|||
|
方法一: 一次赋一个值
|
|||
|
|
|||
|
```shell
|
|||
|
数组名[索引]=变量值
|
|||
|
[root@xingdiancloud ~]# array1[0]=pear
|
|||
|
[root@xingdiancloud ~]# array1[1]=apple
|
|||
|
[root@xingdiancloud ~]# array1[2]=orange
|
|||
|
[root@xingdiancloud ~]# array1[3]=peach
|
|||
|
```
|
|||
|
|
|||
|
方法二: 一次赋多个值
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# array2=(tom jack alice)
|
|||
|
[root@xingdiancloud ~]# array5=(tom jack alice "bash shell")
|
|||
|
[root@xingdiancloud ~]# colors=($red $blue $green $recolor)
|
|||
|
[root@xingdiancloud ~]# array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
|
|||
|
[root@xingdiancloud ~]# array8=`cat /etc/passwd`
|
|||
|
```
|
|||
|
|
|||
|
##### 关联数组
|
|||
|
|
|||
|
申明该数组为关联数组
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# declare -A ass_array1
|
|||
|
[root@xingdiancloud ~]# declare -A ass_array2
|
|||
|
```
|
|||
|
|
|||
|
方法一: 一次赋一个值
|
|||
|
|
|||
|
```shell
|
|||
|
数组名[索引]=变量值
|
|||
|
[root@xingdiancloud ~]# ass_array1[index1]=pear
|
|||
|
[root@xingdiancloud ~]# ass_array1[index2]=apple
|
|||
|
[root@xingdiancloud ~]# ass_array1[index3]=orange
|
|||
|
[root@xingdiancloud ~]# ass_array1[index4]=peach
|
|||
|
```
|
|||
|
|
|||
|
方法二: 一次赋多个值
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')
|
|||
|
```
|
|||
|
|
|||
|
一步走
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
|
|||
|
[root@xingdiancloud ~]# declare -A ass_array2='([index4]="bash shell" [index1]="tom" [index2]="jack" [index3]="alice" )'
|
|||
|
```
|
|||
|
|
|||
|
#### 4.访问数组元素
|
|||
|
|
|||
|
##### 普通数组
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# echo ${array1[0]} 访问数组中的第一个元数
|
|||
|
[root@xingdiancloud ~]# echo ${array1[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
|
|||
|
[root@xingdiancloud ~]# echo ${#array1[@]} 统计数组元数的个数
|
|||
|
[root@xingdiancloud ~]# echo ${!array2[@]} 获取数组元数的索引
|
|||
|
[root@xingdiancloud ~]# echo ${array1[@]:1} 从数组下标1开始
|
|||
|
[root@xingdiancloud ~]# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素
|
|||
|
```
|
|||
|
|
|||
|
##### 关联数组
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# echo ${ass_array2[index2]} 访问数组中的第二个元数
|
|||
|
[root@xingdiancloud ~]# echo ${ass_array2[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
|
|||
|
[root@xingdiancloud ~]# echo ${#ass_array2[@]} 获得数组元数的个数
|
|||
|
[root@xingdiancloud ~]# echo ${!ass_array2[@]} 获得数组元数的索引
|
|||
|
```
|
|||
|
|
|||
|
#### 5.数组遍历
|
|||
|
|
|||
|
方法一: 通过数组元数的个数进行遍历
|
|||
|
|
|||
|
方法二: 通过数组元数的索引进行遍历
|
|||
|
|
|||
|
案例一:利用元素进行遍历
|
|||
|
|
|||
|
```shell
|
|||
|
#!/bin/bash
|
|||
|
#定义数组
|
|||
|
array=(Mon Tue Wed Thur Fir Sat Sun)
|
|||
|
#数组遍历
|
|||
|
for day in ${array[*]}
|
|||
|
do
|
|||
|
echo $day
|
|||
|
done
|
|||
|
```
|
|||
|
|
|||
|
案例二:利用索引进行遍历
|
|||
|
|
|||
|
```
|
|||
|
[root@xingdiancloud ~]# cat hello.sh
|
|||
|
#!/bin/bash
|
|||
|
for line in `cat /etc/hosts`
|
|||
|
do
|
|||
|
hosts[++j]=$line
|
|||
|
done
|
|||
|
|
|||
|
for i in ${!hosts[@]}
|
|||
|
do
|
|||
|
echo "$i : ${hosts[i]}"
|
|||
|
done
|
|||
|
[root@xingdiancloud ~]# bash hello.sh
|
|||
|
1 : 127.0.0.1
|
|||
|
2 : localhost
|
|||
|
3 : localhost.localdomain
|
|||
|
4 : localhost4
|
|||
|
5 : localhost4.localdomain4
|
|||
|
6 : ::1
|
|||
|
7 : localhost
|
|||
|
8 : localhost.localdomain
|
|||
|
9 : localhost6
|
|||
|
10 : localhost6.localdomain6
|
|||
|
```
|
|||
|
|
|||
|
定义换行符
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# cat hello.sh
|
|||
|
#!/bin/bash
|
|||
|
IFS=$'\n'
|
|||
|
for line in `cat /etc/hosts`
|
|||
|
do
|
|||
|
hosts[++j]=$line
|
|||
|
done
|
|||
|
|
|||
|
for i in ${!hosts[@]}
|
|||
|
do
|
|||
|
echo "$i : ${hosts[i]}"
|
|||
|
done
|
|||
|
[root@xingdiancloud ~]# bash hello.sh
|
|||
|
1 : 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
|
|||
|
2 : ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
|
|||
|
```
|
|||
|
|
|||
|
#### 6.项目案例
|
|||
|
|
|||
|
通过数组统计性别:把要统计的对象作为数组的索引
|
|||
|
|
|||
|
```shell
|
|||
|
[root@xingdiancloud ~]# cat sex.txt
|
|||
|
zhangsan f
|
|||
|
lisi m
|
|||
|
|
|||
|
[root@xingdiancloud ~]# cat sex.sh
|
|||
|
#!/usr/bin/bash
|
|||
|
declare -A sex
|
|||
|
while read line
|
|||
|
do
|
|||
|
type=`echo $line | awk '{print $2}'`
|
|||
|
let sex[$type]++
|
|||
|
done < sex.txt
|
|||
|
#m作为数组的索引
|
|||
|
|
|||
|
for i in ${!sex[@]}
|
|||
|
do
|
|||
|
echo "$i : ${sex[$i]}"
|
|||
|
done
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|