什么是数组
Shell 的数组就是把有限个元素(变量或字符内容)用一个名字命名,然后用编号对它们进行区分的元素集合。这个名字就称为数组名,用于区分不同内容的编号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
有了Shell数组后,就可以用相同名字引用一系列变量及变量值,并通过数字(索引)来识别使用它们。
在许多场合,使用数组可以缩短和简化程序开发。
数组的本质还是变量,是特殊的变量形式
数组中常用变量
${ARRAY_NAME[INDEX]} # 引用数组中的元素 注意:引用时,只给数组名,表示引用下标为0的元素 ${#ARRAY_NAME[*]} # 数组中元素的个数 ${#ARRAY_NAME[@]} # 数组中元素的个数 ${ARRAY_NAME[*]} # 引用数组中的所有元素 ${ARRAY_NAME[@]} # 引用数组中的所有元素 ${#ARRAY_NAME} # 数组中下标为 0 的字符个数
数组的定义
通过
数组名[下标]
对数组进行定义和赋值,如果下标不存在,自动添加新一个数组元素,如果下标存在就覆盖原来的值删除数组和删除变量是一样的,使用
unset
即可
小括号定义数组变量
- 用小括号将变量值括起来赋值给数组变量,每个变量值之间要用空格分隔
arry=(hello world)
输出数组的变量值
索引数组下标从数字0开始,0表示第一个变量值
小括号加键值对定义数组变量
arry=([3]=hello [4]=world)
输出数组的变量值
echo ${arry[@]} echo ${arry[3]} echo ${arry[4]}
指定数组下标,输出指定的变量值
分别定义数组变量
arry[0]=hello arry[1]=world
arrys[0]=study arrys[1]=shell
输出数组的变量值
echo ${arry[@]} echo ${arrys[@]}
动态地定义数组变量
- 使用命令的输出结果作为数组的内容
arry=($(ls /etc/ | head -n 5 ))
输出数组的变量值
echo ${arry[@]}
数组赋值的切片
#!/usr/bin/env bash array=({a..z}) echo "数组的变量值为:${array[@]}" echo "数组的变量值个数为:${#array[@]}" echo "从第一个字符开始往后的五个字符的内容: ${array[@]:0:5}" echo "从第六个字符开始往后的五个字符的内容: ${array[@]:5:5}"
结果如下
数组的变量值为:a b c d e f g h i j k l m n o p q r s t u v w x y z 数组的变量值个数为:26 从第一个字符开始往后的五个字符的内容: a b c d e 从第六个字符开始往后的五个字符的内容: f g h i j
数组的赋值删除、替换,与变量的赋值删除、替换的方式也是一样的,只是数组的变量值的书写方式不同,区别在于[@]
,这是数组输出所有变量值的方式
关于变量的赋值删除、替换,可以看我的另一篇博客()[01-我们一起来学Shell - shell的变量]
遍历数组
#!/usr/bin/env bash array=(hello world welcome to study shell) for (( i=0; i<${#array[@]}; i++ )) do echo "for循环遍历数组方式一: ${array[i]}" done echo " " for var in ${array[@]} do echo "for循环遍历数组方式二: ${var}" done echo " " i=2 while [[ $i < ${#array[@]} ]] do echo "while循环遍历数组: ${array[i]}" let i++ done
结果如下
for循环遍历数组方式一: hello for循环遍历数组方式一: world for循环遍历数组方式一: welcome for循环遍历数组方式一: to for循环遍历数组方式一: study for循环遍历数组方式一: shell for循环遍历数组方式二: hello for循环遍历数组方式二: world for循环遍历数组方式二: welcome for循环遍历数组方式二: to for循环遍历数组方式二: study for循环遍历数组方式二: shell while循环遍历数组: welcome while循环遍历数组: to while循环遍历数组: study while循环遍历数组: shell
while是当变量(数组下标)小于数组长度时进入循环体,所以,没有输出hello和world
关联数组
Bash 支持关联数组,它可以使用字符串作为数组索引,关联数组一定要事先声明才行,不然会按照索引数组进行执行
使用 declare -A 来定义一个关联数组
使用${!arry[@]}来获取数组的索引列表
#!/usr/bin/env bash declare -A city_arry=([zhangsan]=ShangHai [lisi]=BeiJing [wangwu]=GuangZhou) for CITY in ${!city_arry[@]} do echo "${CITY} come from ${city_arry[${CITY}]}" done
通过${!city_arry[@]}
将索引输出给${CITY}
,再通过${city_arry[${CITY}]}
,循环输出变量值
结果如下
zhangsan come from ShangHai lisi come from BeiJing wangwu come from GuangZhou