[toc]
shell数组
1.shell数组概念
概念
- shell数组就是一个元素集合,它把有限个元素(变量或字符组合)用一个名字来命名,然后用编号对他们进行区分,这个名字就称为数组名
数组下标
- 用于区分不同内容的编号
数组元素
- 组成数组的各个元素,也称为变量
2.shell数组定义
2.1 shell数组分类
普通数组:数组下标只能是数字
关联数组:数组下标可以是字符,通过 declare -A 数组名
定义
2.2 普通数组
方法一 用小括号将变量值括起来 赋值给数组变量,每个变量之间要用空格进行分隔,常用定义方法
语法
array=(value1 value2 value3 ... )
使 用示例
$ array=(1 2 3)
$ echo ${array[*]}
1 2 3
方法二 用小括号将变量值括起来,同时采用键值对的形式复制,不常用
语法
array=( [1]=one [2]=two [3]=three )
使用示例
$ array=( [1]=one [2]=two [3]=three )
$ echo ${array[*]}
one two three
$ echo ${array[1]}
one
$ echo ${array[2]}
two
$ echo ${array[3]}
three
方法三 通过分别定义数组变量的方法来定义,不常用
语法
array[0]=a;array[1]=b;array[2]=c
使用示例
$ array[0]=a;array[1]=b;array[2]=c
$ echo ${array[0]}
a
$ echo ${array[1]}
b
$ echo ${array[2]}
c
方法四 动态的定义数组变量,并使用命令的输出结果作为数组的内容
语法
array=($(命令))
或
array=(`命令`)
使用示例
$ mkdir /array
$ touch /array/{1..3}.txt
$ ll /array/
total 0
-rw-r--r-- 1 root root 0 Nov 12 08:37 1.txt
-rw-r--r-- 1 root root 0 Nov 12 08:37 2.txt
-rw-r--r-- 1 root root 0 Nov 12 08:37 3.txt
$ array=($(ls /array))
$ echo ${array[*]}
1.txt 2.txt 3.txt
array=(`ls /array`)
$ echo ${array[*]}
1.txt 2.txt 3.txt
2.3 关联数组
2.3.1 定义关联数组
普通数组的下标不能为字符
$ array=([a]=hehe [b]=haha [c]=xixi)
#输出不正确
$ echo ${array[*]}
xixi
定义关联数组,需要提前用declear -A 数组名
定义
$ declare -A array
$ array=([a]=hehe [b]=haha [c]=xixi)
$ echo ${array[*]}
hehe haha xixi
关联数组使用示例
#定义了一个关联数组array
$ declare -A array
#让下标为m的数组元素自增1,此时m为1
$ let array[m]++
#让下标为m的数组元素自增1,此时m为2
$ let array[m]++
#让下标为f的数组元素自增1,此时f为1
$ let array[f]++
#打印下标为m出现的次数
$ echo ${array[m]}
2
#打印下标为f出现的次数
$ echo ${array[f]}
1
2.3.2 关联数组脚本示例
统计 /etc/passwd
中每个bash出现的次数
思路:
1.将/etc/passwd的最后一列取出来,因为最后一列是bash类型
2.定义关联数组,将取出来的bash类型存放到数组中
3.for循环遍历数组,输出相同下标的数组元素
编辑脚本
#!/usr/bin/env bash
#定义一个关联数组
declare -A array
#使用while循环从/etc/passwd文件中读取每一行
while read line
do
#把/etc/passwd中bash类型取出来
PASSWD=`echo $line|awk -F: '{print $NF}'`
#让每一行bash自增1,这样最后就会把相同bash相加
let array[$PASSWD]++
done </etc/passwd
#for循环遍历数组下标
for i in ${!array[*]}
do
#打印数组下标并打印数组下标出现个数
echo $i ${array[$i]}
done
执行结果如下
/sbin/nologin 21
/bin/sync 1
/bin/bash 2
/sbin/shutdown 1
/sbin/halt 1
2.3.3 关于关联数组的问题
2.3.3.1 关联数组赋值时必须指定下标
#先定义一个关联数组
$ declare -A array
#在给数组赋值的时候提示为关联数组赋值时必须使用下标
$ array=(1 2 3)
bash: array: 1: must use subscript when assigning associative array
bash: array: 2: must use subscript when assigning associative array
bash: array: 3: must use subscript when assigning associative array
#此时必须给数组元素指定下标
$ array=([1]=1 [2]=2 [3]=3)
//查看元素显示
$ echo ${array[*]}
1 2 3
//查看数组下标
$ echo ${!array[*]}
1 2 3
//依据数组下标查看数组元素正确
$ echo ${array[1]}
1
$ echo ${array[2]}
2
$ echo ${array[3]}
3