shell 也支持数组,就是写法跟平时的开发语言不太一样,反正我是觉得挺别扭。

声明数组

数组数据使用一对括号( var )包起来,就能成为数组。

1
2
3
4
arr=(10 20 30 40)
echo $arr
echo $arr[1]
echo $arr[2]

结果:

10
20

打印数组

打印数组的话要注意,直接打印数组,只会打印出第一条数数据,必须加上*#,才能全部输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
#数组取值

days=(one two three 4)
echo ${days}
echo ${days[0]}
echo ${days[1]}
echo ${days[@]}
echo ${days[*]}

echo "**********"
# 重置数组
names=()

names[1]=tom
names[2]=jack
echo ${names}
echo ${names[1]}
echo ${names[@]}

结果:

one
one
two
one two three 4
one two three 4


tom
tom jack

数组遍历

直接遍历

1.使用 ${数组名[@]}${数组名[#]} 均可以获得所有元素

2.带数组下标的遍历,当需要使用到数组的下标时,可以使用${!数组名[@]}
3.while循环:根据元素的个数遍历,但对于稀疏数组,可能会丢失数据

1
2
3
4
5
days=(one two three 4)
for day in ${days[*]} #或${days[@]}
do
echo $day
done

通过下标遍历,符号 !

用 for in 来遍历,取下标一般用 !。
使用 ! 时,下面例子中的 i 的值为下标。
如果要拿到值,在for中取的是${i}的值,两种写法都可以,自行选择。

1
2
3
4
5
6
7
8
#!/bin/bash
days=(one two three four)
#fou循环带下标遍历
for i in ${!days[@]}
do
# 此刻 i 为下标,通过下标取数组的值
echo ${days[$i]} #这里没有 !
done

入参转数组

如果想在执行脚本的时候把所有参数当成一个数组使用,也可以这样:

1
2
3
4
5
test1=`${@}`
# 从第2个参数位开始
test2=`echo ${@:2}`
echo $test1
echo $test2

执行一下

sh test.sh 11 22 33 44

结果:

11 22 33 44
22 33 44

函数间数组传递

这个就比较绕了,绕在哪呢,就在传递没问题,接收的话,还是要用( )来接收,否则就只能接收到数组的第一个元素,因为在传入时,数组的所有元素被当成一个个参数传入,通过$1 $2 ...也可以获取到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

test1 () {
echo "test1 result: "
echo "函数接收到的参数列表为: $@" #这里是函数位置变量$@

#将接受到的参数,定义成一个新的数组
newarr=($@) #位置参数,如果使用$1,只会取第一个值
echo "新的数组的值为: ${newarr[@]}"
for i in ${newarr[@]}; do
echo "${i}"
done
}

test2() {
echo "test2 result: "
newarr1=$1 #位置参数,如果使用$1,只会取第一个值
newarr2=$2
# 数组被当作元素传入
echo $newarr1 $newarr2
}

################### main ########################

arr=(10 20 30 40 50)

echo "原始数组的值为: ${arr[@]}"

#调用函数,将数组的元素作为函数的位置变量
main () {
test1 ${arr[@]}
test2 ${arr[@]}
#如果直接使用 $arr 作为位置变量,则只会将数组的第一个元素传递过去
}
main

结果:

原始数组的值为: 10 20 30 40 50
test1 result:
函数接收到的参数列表为: 10 20 30 40 50
新的数组的值为: 10 20 30 40 50
10
20
30
40
50
test2 result:
10 20

总结

shell 的数组,函数间数组传递需要注意其它的大同小异。