shell 数组

2023-10-20 11:48:28 浏览数 (1)

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

声明数组

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

代码语言:javascript复制
arr=(10 20 30 40)
echo $arr
echo $arr[1]
echo $arr[2]

结果:

10 20

打印数组

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

代码语言:javascript复制
#!/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 的数组,函数间数组传递需要注意其它的大同小异。

0 人点赞