引言
数组是一种特殊的数据结构,即一个由若干同类型变量组成的集合。其中的每一项被称为一个元素。数组均由连续的存储单元组成,最低地址对应数组的第一个元素,最高地址对应最后一个元素。
bash shell 只支持一维数组(不支持多维数组),并没有限定数组的大小。注意:bash shell所支持的最大数组标号为5999147937791。
Shell 数组基本用法
在shell脚本中,用括号来标识数组,数组元素用空格符号分隔开。表示数组一般的形式为:数组名=(值1 值2 ... 值n)。其中,读取数组元素值的一般格式:${数组名[下标]}。
#!/bin/bash # 数组初始化 array=(1 2 3 4 5) echo "第1个元素为: ${array[0]}" echo "第2个元素为: ${array[1]}" echo "第3个元素为: ${array[2]}" echo "第4个元素为: ${array[3]}" echo "第5个元素为: ${array[4]}"
上述例子,运行结果如下:
在shell脚本中,数组的初始化有两种:用圆括号将一组值赋给数组和单独给数组每个元素或部分元素赋值。
#!/bin/bash # 数组初始化 array[0]=1 array[1]=2 array[2]=3 array[3]=4 array[4]=5 echo "第1个元素为: ${array[0]}" echo "第2个元素为: ${array[1]}" echo "第3个元素为: ${array[2]}" echo "第4个元素为: ${array[3]}" echo "第5个元素为: ${array[4]}"
上述例子,运行结果如下:
使用@或*符号可以获取数组中的所有元素:${数组名[@]} 或者 ${数组名[*]}。
#!/bin/bash # 数组初始化 array=(1 2 3 4 5) echo "所有元素(array[@])为: ${array[@]}" echo "所有元素(array[*])为: ${array[*]}"
上述例子,运行结果如下:
在shell数组中,获取数组长度的一般形式为:${#array_name[@|*]}。
#!/bin/bash # 获取数组的长度 array[0]=A array[1]=B array[2]=C array[3]=D echo "数组元素个数为: ${#array[*]}" echo "数组元素个数为: ${#array[@]}"
上述例子,运行结果如下:
shell 数组的抽取子串的一般形式为:${数组名[@|*]:n:m},其中n表示抽取的起始元素,m表示抽取的结束元素,若m省略,默认情况下抽取从起始位置元素开始到数组最后一个元素。其中,n为开始元素下标,m为结束元素下标。
#!/bin/bash city=(Nanjing Atlanta Massachusetts Marseilles) #建立一个简单的数组 echo "Extracting Substring" echo ${city[*]:0} #抽取整个数组 echo ${city[*]:1} #抽取从第1个元素到结束的数组 echo ${city[*]:3} #抽取从第3个元素到结束的数组 echo ${city[*]:0:2} #抽取从第0个元素开始的2个元素 echo
echo "Removing Substring" #演示删除子串功能 echo ${city[*]#M*a} #删除从M到a的最短子串 echo ${city[*]##M*a} #删除从M到a的最长子串 echo
echo "Replcing Substring" #演示替换子串功能 echo ${city[*]/M*s/Year} #替换第1次与M*s匹配的子串 echo ${city[*]//M*s/Year}
上述例子,运行结果如下:
shell数组中,若要删除某个数组元素,即 unset 数组名[下标]。若要清空整个数组,即unset 数组名。
shell数组中,模式替换的一般形式为:${数组名[@或*]/模式/新值}。
shell数组在初始化后,很多情况,时常会碰到数组遍历的问题。在shell 数组中,遍历的一般形式如下:
for i in ${arr_number[@]}; do echo $i; done
结束语
通过shell数组的简单基本操作的使用,可以加强shell脚本的开发和应用。