shell 也支持数组,就是写法跟平时的开发语言不太一样,反正我是觉得挺别扭。
声明数组
数组数据使用一对括号( var )
包起来,就能成为数组。
arr=(10 20 30 40)
echo $arr
echo $arr[1]
echo $arr[2]
结果:
10 20
打印数组
打印数组的话要注意,直接打印数组,只会打印出第一条数数据,必须加上*
或 #
,才能全部输出。
#!/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循环:根据元素的个数遍历,但对于稀疏数组,可能会丢失数据
代码语言:javascript复制days=(one two three 4)
for day in ${days[*]} #或${days[@]}
do
echo $day
done
通过下标遍历,符号 !
用 for in 来遍历,取下标一般用 !。 使用 ! 时,下面例子中的 i 的值为下标。 如果要拿到值,在for中取的是${i}的值,两种写法都可以,自行选择。
代码语言:javascript复制#!/bin/bash
days=(one two three four)
#fou循环带下标遍历
for i in ${!days[@]}
do
# 此刻 i 为下标,通过下标取数组的值
echo ${days[$i]} #这里没有 !
done
入参转数组
如果想在执行脚本的时候把所有参数当成一个数组使用,也可以这样:
代码语言:javascript复制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 ...也可以获取到。
代码语言:javascript复制#!/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 的数组,函数间数组传递需要注意其它的大同小异。