shell序列和数组的使用方法

一、seq方法和通过内部{begin..end}的性能比较

# time echo {1..100}
1 2 3 ...

real  0m0.000s
user  0m0.001s
sys   0m0.000s

# time echo $(seq 100)
1 2 3 ...

real  0m0.003s
user  0m0.002s
sys   0m0.001s

从上面可以看到,{begin..end}速度比seq调用快了不少了。 以后调用时候可以考虑通过内部操作符完成。

二、数组概述

1.数组的概念

是一种容器,可以同时存放多个数据值。

2.数组的特点

1.数组是一种引用数据类型。
2.数组当中的多个数据,类型 必须统一。
3.数组长度在程序运行期间不可改变。

3.数组定义方法
方法1
数组名=(value0 value1 value2 …)

方法2
数组名=([0]=value [1]=value [2]=value …)

方法3
列表名=“value0 value1 value2 …”
数组名=($列表名)

方法4
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

三、

数组包括的数据类型

1.数据类型

(1)数值类型
(2)字符类型(字符串)
使用" " 或 ’ ’ 定义,防止元素当中有空格,元素按空格分割

2.获取数组长度
arr_number=(1 2 3 4 5)
echo ${#arr_number[*]} 或 echo ${#arr_number[@]}
3.获取数据列表
echo ${arr_number[*]}
或
echo ${arr_number[@]}
4.读取某个下标赋值
arr_index2=${arr_number[2]}
echo $arr_index2

四、使用数组

1.数组遍历

2.数组切片

# arry=(1 2 3 4 5 6)
# echo ${arry[*]}    #输出整个数组,此处*与@相同       
# 1 2 3 4 5 6     

# echo ${arry[@]:0:2}   #获取 ${数组名[@或*]:起始位置:长度} 的值
# 1 2
echo ${arry[@]:2:2}
# 3 4
3.数组替换

方法一:替换所有符合条件的

格式:${数组名[*或@]/源参数值/将要替换的参数值}
# arr2=(1 2 3 4 5)
#临时替换:将数组arr1中的参数值3替换为66,但原来的数组中的参数值并不会改变
# echo ${arr2[*]/3/66}     
# echo ${arr2[*]}
# 1 2 3 4 5

#永久替换:可通过重新赋值实现
# arr2=(${arr2[*]/3/66})   
# echo ${arr2[*]}
# 1 2 66 4 5

方法二:替换单个,指定下标替换。

# arry=(1 2 3 4 5 6)
# arry[0]=7
# echo ${arry[*]}
# 7 2 3 4 5 6
4.数组删除
格式:unset 数组名[索引]     #删除单个
      unset 数组名          #删除整个数组
5.数组追加元素

方法一:单个添加

# arr=(1 2 3 4 5 6 7)
# echo ${arr[6]}   #7
# arr[7]=8
# echo ${arr[*]} # 1 2 3 4 5 6 7 8

方法二:增加数组长度填加

# arr4=(1 2 3 4 5 6 7)
# arr4[${#arr4[*]}]=8  #根据长度添加参数
# echo ${arr4[*]}  #1 2 3 4 5 6 7 8

方法三:重新定义数组

# arr4=(1 2 3 4 5 6 7)
# arr4=("${arr4[@]}" 8 9 10)  #加上新参数重新定义数组
# echo ${arr4[*]} #1 2 3 4 5 6 7 8 9 10

双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“* ”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

6.函数返回数组

 

查看代码

#!/bin/bash

#用于求数组中所有元素的累加和
test2 () {
   newarr1=($@)
   arrlist=${newarr1[*]}
   sum=0

   for i in $arrlist
   do
     sum=$[$sum+$i]
   done
   echo $sum

}

#用于把原数组中所有元素值乘以2后生成一个新的数组并输出
test3 () {
    newarr2=($@)
    length=${#newarr2[@]}
    for ((j=0;j<$length;j++))
    do
	echo $j
      newarr2[$j]=$[${newarr2[$j]} * 2]
    done
    echo ${newarr2[*]}

}
######main######

arry=(10 20 30 40 50)
echo "原数组的列表为:${arry[@]}"
res1=`test2 ${arry[@]}`
res2=`test3 ${arry[@]}`
echo "test2中的新数组的累加和为:$res1"
echo "test3中的新数组的累加和为:$res2"
posted @ 2022-05-21 18:23  zhuguoqing  阅读(204)  评论(0编辑  收藏  举报