前言
在编写 shell script 时候,有时需要定将数组作为参数传递函数。
下面是将和 shell 中数组相关的知识点做一个简单的梳理,方便后面查阅。
shell 数组定义
数组定义主要有下面几种方式:
declare -a arrayOfPort #定义一个数组,名字是arrayOfPort
arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080 #即array[key]=value形式
arrayOfPort=(21 23 80 8080) #直接初始化
arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)
arrayOfPort="21 23 80 8080" #定义字符串
echo ${arrayOfPort[0]} #可以把arrayOfPort变量当作数组来处理
echo ${arrayOfPort[@]} #可以把arrayOfPort变量当作数组来处理
echo ${arrayOfPort[*]} #可以把arrayOfPort变量当作数组来处理
获取数组元素
${arrayOfPort[0]},${arrayOfPort[1]} #获取数组元素
str=${arrayOfPort[*]} #以空格分隔各数组字符串
str=aa" "bbb" "cccc; arrayOfStr=($str); #空格分隔的字符串转换成数组,不太推荐
echo ${#arrayOfStr[@]}; #获取arrayOfStr数组长度 3
echo ${arrayOfStr[@]}; #输出arrayOfStr数组内容 aa bbb cccc
str=$(ls ./); arrayOfDir=($str) #可以把 `ls`,`find` 等命令的返回值转换成数组
arrayOfDir=($(ls ./)) #和上面一行命令等价
获取数组长度
获取数组长度的方法主要有下面几种:
arrayOfPort=(21 23 80 8080) #定义并初始化arrayOfPort
${#arrayOfPort[@]} #获取数组arrayOfPort个数
${#arrayOfPort[*]} #获取数组arrayOfPort个数
删除数组元素
arrayOfPort=(21 23 80 8080) #定义并初始化arrayOfPort
unset arrayOfPort[1] #删除数组arrayOfPort中第一个元素
unset arrayOfPort #删除整个arrayOfPort数组
遍历数组元素
下面已 for 循环举例来看下如何遍历数组元素。
#!/bin/sh
#Traversing the array of arrayOfPort
##################################
# main function define
##################################
main()
{
local param=0
arrayOfPort=(21 23 80 8080)
#arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080
#arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)
echo -e "arrayOfPort is "
for i in ${arrayOfPort[*]}
do
echo -e "${i} "
done
return $param
}
main $@
上面的例子执行结果为:
[root@localhost ~]# ./arrayOfPort.sh
arrayOfPort is
21
23
80
8080
数组作为函数参数
个别场景需要将数组作为参数,传递给函数。
#!/bin/sh
#Traversing the array of arrayOfPort by function
##################################
# foo function define
##################################
foo()
{
local param=0
echo -e "print the array "
local localArrayOfPort=${1}
for i in ${localArrayOfPort[*]}
do
echo -e "${i} "
done
return $param
}
##################################
# main function define
##################################
main()
{
local param=0
arrayOfPort=(21 23 80 8080)
#arrayOfPort[0]=21; arrayOfPort[1]=23; arrayOfPort[2]=80; arrayOfPort[3]=8080
#arrayOfPort=([0]=21 [1]=23 [2]=80 [4]=8080)
echo -e "print the arrayOfPort"
#foo $arrayOfPort #这样子传参,只是将arrayOfPort[数组名]称传递过去,而不是数组本身。
foo "${arrayOfPort[*]}" #正确的写法
return $param
}
main $@
上面的例子执行结果为:
[root@localhost ~]# ./arrayOfPort.sh
print the arrayOfPort
print the array
21
23
80
8080