shell-------数组遍历切片替换等操作

Posted 噫噫噫呀呀呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell-------数组遍历切片替换等操作相关的知识,希望对你有一定的参考价值。

一、数组

(一)定义方法

(30 20 10 60 50 40)
 0  1  2  3  4  5
 ==从下标0开始==
方法1:
数组名= (value0 value1 value2 ...) 

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

方法3:
列表名="value0 value1 value2 ..."
数组名=($列表名)

方法4:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

在这里插入图片描述
在这里插入图片描述

(二)数据类型

▶数值类型
▶字符类型(使用" "或者’ '定义)

(三)获取数组长度

arr number=(1 2 3 4 5)
arr_length=${#arr_number[*]}
           ${#arr_number[@]}
echo $arr_length

在这里插入图片描述

(四)获取数据列表

echo ${arr_number[*]}
echo ${arr_number[@]}

在这里插入图片描述

(五)读取某下标赋值

arr_index2=${arr_number [2]}
echo $arr_index2

在这里插入图片描述

二、数组遍历

#!/bin/bash

arr=(10 20 30 40 50)
for i in ${arr[@]}
do
  echo $i
done

在这里插入图片描述

三、数组切片

arr=(1 2 3 4 5)
echo ${arr[@]}       #输出整个数组
echo ${arr[@]:0:2}   #获取${ 数组名[@或*] :起始位置:长度}的值
echo ${arr1[*]:1:3}
echo ${arr[@]:2:3}

在这里插入图片描述

四、数组替换

arr=(1 2 3 4 5)
echo ${arr[@]/4/66}  #${数组名[@或*]/查找字符/替换字符}
echo ${arr[@]}      #并不会替换数组原有内容

arr=(${arr[@]/4/66})  #要实现改变原有数组,可通过重新赋值实现
echo ${arr[@]}

在这里插入图片描述
在这里插入图片描述

五、数组删除

arr=(1 2 3 4 5)
unset arr   #删除数组
echo ${arr[*]}

arr=(1 2 3 4 5)
unset arr[2]    #删除第三个元素
echo ${arr[*]}

在这里插入图片描述

六、数组追加元素

方法1:
array_name[index]=value

方法二:
array_name[${#array_name[@]}]=value

方法三:
array_name=("${array_name[@]}" value1 ... valueN)
#双引号不能省略,否则,当数组array_ name中存在包含空格的元素时会按空格将元素拆分成多个
#不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致, 加双引号时,会将数组array_ name中的所有元素作为一个 元素添加到数组中
for i in "${array_name[@]}"; do echo $i; done

方法四:
array_name+=(value1...valueN)
待添加元素必须用“()"包围起来,并且多个元素用空格分隔

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、向函数传数组参数

如果将数组变量作为函数参数,函数贝会取数组变量的第一个值

test1() {
   echo "接收到的参数列表: $@"
   newarrary= ($1)
   echo "新数组的值为: ${newarrary[*]}"
}

array=(3 2 1 4 5)
echo "原始数组的值为: ${array[*]}"
test1 $array

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新
的数组变量

test2() {
   newarrary=($(echo $@))
   echo "新数组的值为: $ {newarrary[*]}"
}

array=(3 2 1 4 5)
echo "原始数组的值为: ${array[*]}"
test2 ${array[*]}

在这里插入图片描述
大致步骤为:
1. 先讲数组拆分成列表 ${arr[@]}
2. 函数通 @ 获 取 之 前 将 数 组 拆 分 成 后 列 表 的 值 3. 在 函 数 中 重 新 把 列 表 定 义 成 数 组 n e w a r r = ( @ 获取之前将数组拆分成后列表的值 3. 在函数中重新把列表定义成数组 newarr=( @3.newarr=(@)
4. 在对新的数组进行处理,最后echo返回结果

八、从函数返回数组

将一个数组中的值全部乘以2后输出

function test1(){
	newarr=($@)   #列表转成数组
	sum=0
	for i in ${newarr[@]}
	do
		sum=$[$sum+$i]   #遍历数组元素进行相加
	done
	echo $sum
}

function test2(){
	newarray=($@)     #列表转成数组
	
	#length=${#newarray[@]}
	#for ((i=0; i<=$length-1; i++))
	
	for ((i=0; i<=$[$# - 1]; i++))
	do
		newarray[$i]=$[${newarray[$i]}*2]   #每个元素乘以2后再赋给该元素
	done
	echo ${newarray[*]}  #返回整个数组
}

#####
arr=(1 3 6 10 8)
echo "原始数组为:${arr[@]}"

result=`test1 ${arr[*]}`
echo "新数组的和为:"$result

newarray=`test2 ${arr[*]}`       #获取整个数组
#newarray=(`test2 ${arr[*]}`)
echo "新数组乘以二后为:"${newarray[*]}    #输出数组

在这里插入图片描述

以上是关于shell-------数组遍历切片替换等操作的主要内容,如果未能解决你的问题,请参考以下文章

shell之数组

自动化运维必须要学的Shell脚本之——数组(冒泡排序和反转排序等)

Shell脚本------数组

Shell编程之数组

shell脚本中的数组排序

shell数组