创建数组
1. 顺序赋值
单个赋值
orderArr[0]="element1"
orderArr[1]="element2"
orderArr[2]="element3"
一次性赋值
orderArr2=(element1 element2 element3)
2. 无序赋值
指定位置赋值
disorderArr2=(element1 [5]=element2 element3)
(element1 的索引为0,element3 的索引为 6)
一次性指定位置赋值
disorderArr=([6]=saturday [5]=friday [4]=thursday
[3]=wednesday [0]=sunday [1]=monday [2]=tuesday)
3. 通过 declare 命令声明一个普通数组
普通数组(即同前面创建的数组)
declare -a declareArr
4. 通过扩展声明一个数组
#!/bin/bash
numArr=({0..10})
alpArr=({a..k})
fileArr=( *.sh )
echo ${numArr[@]}
echo ${alpArr[@]}
echo ${fileArr[@]}
输出:
0 1 2 3 4 5 6 7 8 9 10
a b c d e f g h i j k
func.sh test.sh
5. 关联数组
declare -A declareArr
关联数组是一个允许非整数为下标索引的数组,可以理解为一个Map。
#!/bin/bash
declare -A arr
arr["name"]=C99
arr["age"]=22
arr[1]=100
echo ${arr["name"]}
echo ${arr["age"]}
echo ${arr[1]}
6. Copy 创建一个数组
${copyArr[@]}
的含义为读取数组的所有元素,下面会说到。
语法:arr=( "${copyArr[@]}" )
#!/bin/bash
copyArr=(a b c)
arr=( "${copyArr[@]}" )
echo "${arr[@]}"
7. 读取一个数据到数组中
read -a arr
读取数组
1、读取默认元素
如果没有指定索引值,默认读取索引为0的第一个元素:echo ${arr}
赋值也是同理:
declare -a arr
arr="element"
echo ${arr[0]}
2、读取指定索引的元素
echo ${arr[1]}
3、读取所有元素
@、*
在数组中是两个特殊索引,可以通过这两个字符获取数组的所有元素。
#!/bin/bash
arr=(element1 element2)
echo "${arr[@]}"
echo "${arr[*]}"
输出:
element1 element2
element1 element2
4、通过 for in 迭代数组
既然可以通过@、*
获取所有数组元素,那么就可配合 for in 迭代所有的数组元素。
#!/bin/bash
arr=(element1 element2)
for element in "${arr[@]}"
do
echo "for in: ${element}"
done
数组有效元素的长度
语法:
${#array[*]}
${#array[@]}
如果数组存在空元素,不会被继续长度统计:
declare -a arr=(e1 [5]=e2 e3)
echo ${#arr[@]} # 输出 3
提取有效的数组元素序号
看下面这个栗子的输出:
#!/bin/bash
declare -a arr=(e1 [5]=e2 e3)
for ((i = 0; i < ${#arr[@]}; i++))
do
echo "index: ${i} -> ${arr[i]}"
# echo "index: ${i} -> ${arr[${i}]}"
done
输出:
index: 0 -> e1
index: 1 ->
index: 2 ->
${#arr[@]}
返回的是有效元素的个数,如果数组中没有空元素,那么上面的 for 迭代是没问题的。
但若索引中有空元素,那么会进行空输出。如果我们想要过滤这些空输出,即只迭代有实际值的数组元素该怎么做呢?
可以通过 for in 的方式进行迭代,for in 中会过滤掉空元素。或者也可以像下面这样:
#!/bin/bash
declare -a arr=(e1 [5]=e2 e3)
for vi in "${!arr[@]}"
do
echo "index: ${vi} -> ${arr[vi]}"
done
输出:
index: 0 -> e1
index: 5 -> e2
index: 6 -> e3
${!arr[@]}
会返回有效元素索引的数组。
数组切片
语法:${arr[@]}:position:length
,从指定索引处开始提取 length 个元素。若不指定 length 则提取到最后一个元素(arr.length - 1)。
栗子:
#!/bin/bash
declare -a games=("GTA5" "LOL" "CS:GO" "RedAlert2")
echo "${games[@]:0:2}"
echo "${games[@]:2}"
输出:
GTA5 LOL
CS:GO RedAlert2
追加数组元素
可以通过+=
运算符进行追加。
$ alp=(a b c)
$ echo ${alp[@]}
a b c
$ alp+=(d e f)
$ echo ${alp[@]}
a b c d e f
删除数组
删除数组:unset
命令
删除数组成员:unset
命令
栗子:
#!/bin/bash
declare -a alp=("a" "b" "c" "d")
echo "${alp[@]}"
unset alp[2]
echo "${alp[@]}"
echo "${#alp[@]}" : "${!alp[@]}"
输出:
a b c d
a b d
3 : 0 1 3
如果通过arr[n]=''
或arr[n]=
的方式删除数组元素是有一些小问题的,将上面栗子中 unset alp[2]
行改为alp[2]=''
或alp[2]=
:
a b c d
a b d
4 : 0 1 2 3
实际上元素并没有真正被删除。