shell之数组
Posted 阳光小王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell之数组相关的知识,希望对你有一定的参考价值。
shell之数组
数组
数组的定义
1.方法一
数组名=(value0 value1 value2)
2.方法二
数组名=([0]=value [1]=value [2]=value …)
3.方法三
列表名=“value0 value1 value2 …”
数组名=($列表名)
4.方法四
数组名[0]=“value”
数组名[1]=“value”
数组名[2]="value"
获取数组长度
定义数组:sz
[root@localhost 1]# sz[0]="10"
[root@localhost 1]# sz[1]="20"
[root@localhost 1]# sz[2]="30"
--------------------------------
获取数组长度
[root@localhost 1]# len=${#sz[@]/[*]} //定义len为变量,获取数组长度,可用@或*
[root@localhost 1]# echo $len
3
1.读取下标赋值
下标赋值读取:
xbfz=${sz[1]} //读取数组下标为1的值
echo $xbfz //输出下标为1的数组值
2.获取数据列表
1.echo ${sz[*]}
2.echo ${sz[@]} //*或@都可以
数组的遍历
[root@localhost 1]# a=(10 20 30 40 50 60) //定义数组
[root@localhost 1]# list=${a[*]} //将数组列表赋值给list
[root@localhost 1]# echo $list
10 20 30 40 50 60
[root@localhost 1]# for i in $list //使用for循环遍历数组
> do
> echo $i
> done
10
20
30
40
50
60
数组的切片、替换与删除
数组的切片
[root@localhost 1]# a=(10 20 30 40 50 60) //定义数组
[root@localhost 1]# echo ${a[*]} //输出数组列表
10 20 30 40 50 60
echo ${a[*]:1:2} //获取 ${数组名[@或*]:起始位置:长度} 的值
20 30
数组的替换
[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60
[root@localhost 1]# echo ${a[*]/6/50}
10 20 30 40 50 500 //临时替换,不会替换原数组内容
===============================================
永久替换:
[root@localhost 1]# yjth=${a[*]/2/300} //先将替换完成的数组赋值给yjth
[root@localhost 1]# echo ${yjth[*]} //输出yjth
10 3000 30 40 50 60
数组的删除
[root@localhost 1]# a=(10 20 30 40 50 60 70)
[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60 70
[root@localhost 1]# unset a //删除整个数组
[root@localhost 1]# echo ${a[*]}
//删除数组后输出为空值
[root@localhost 1]# a=(10 20 30 40 50 60 70)
[root@localhost 1]# echo ${a[*]}
10 20 30 40 50 60 70
[root@localhost 1]# unset a[2] //删除第三个元素
[root@localhost 1]# echo ${a[*]}
10 20 40 50 60 70
数组追加元素
方法一:
[root@localhost 1]# a=(10 20 30)
[root@localhost 1]# a[3]=40
[root@localhost 1]# echo ${a[*]}
10 20 30 40
方法二:
[root@localhost 1]# a=(10 20 30)
[root@localhost 1]# a[3]=40 //方法一
[root@localhost 1]# a[${#a[*]}]=50 //方法二
[root@localhost 1]# echo ${a[*]} //输出数组a
10 20 30 40 50
方法三:
[root@localhost 1]# echo ${a[*]}
10 20 30 40 70 80
[root@localhost 1]# a=("${a[@]}" 60 70 80) //方法三,@不可用*代替,“”不能少
[root@localhost 1]# echo ${a[*]}
10 20 30 40 70 80 60 70 80
方法四:
- 待添加元素必须用“()”包围起来,并且多个元素用空格分隔
a+=(100 200 300 ...)
向函数传数组参数
#!/bin/bash
a() {
echo "函数接收到的参数列表为:$@" //$@表示调用函数时后面跟的所有列表
newarr=($@)
echo "函数中新的数组值为:${newarr[@]}"
}
============主程序=================
arr=(10 20 30 40 50)
echo "原有数组为:${arr[@]}"
a ${arr[@]}
=============运行结果===============
[root@localhost 1]# bash demo1.sh
原有数组为:10 20 30 40 50
函数接收到的参数列表为:10 20 30 40 50
函数中新的数组值为:10 20 30 40 50
从函数返回数组
#!/bin/bash
#求数组中所有元素的累加和
a () {
newarr=($@)
arrlist=${newarr[*]} //将数组先转换成列表arrlist
sum=0
for i in $arrlist
do
sum=$[$sum + $i]
done
echo $sum
}
====把原数组所有元素值*2后生成一个新的数组并输出====
b () {
newarr1=($@)
len=${#newarr1[@]} //获取数组长度
for ((j=0; j<$len; j++))
do
newarr1[$j]=$[${newarr1[$j]} * 2] //下标引索对应的数组参数值*2
done
echo ${newarr1[*]}
}
==============主程序=================
array=(10 20 30 40 50)
echo "原数组的列表为:${array[@]}"
res1=`a ${array[@]}`
echo "a数组中的累加和为:$res1"
res2=$(b ${array[@]})
echo "b数组中的值为:$res2"
数组排序算法
冒泡排序
- 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
- 基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部 - 算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
#!/bin/bash
//定义一个乱序数组
arr=(10 30 20 50 40 60)
//获取数组长度
len=${#arr[*]}
//外重循环控制比较轮数,比较轮数小于等于数组长度减一,并且比较轮数从1开始
for ((i=1; i<$len; i++))
do
//内重循环相信两个数比较大小,大的往后放,从下标引索0对应的值开始比较,比较次数随着比较轮减少而减少
for((j=0; j<$len-$i; j++))
do
//获取第一个下标索引对应的数组元素值
first=${arr[$j]}
//获取第二个下标索引对应的数组元素值
dr=$[$j + 1]
second=${arr[$dr]}
//判断相邻两个元素值的大小,大的往后放,小的往前放,如果第一个元素值大于第二个元素值
if [ $first -gt $second ]; then
//定义一个临时变量,将第一个元素值赋值给临时变量,第二个元素值给第一个,临时变量给第二个
temp=${arr[$j]}
arr[$j]=$second
arr[$dr]=$temp
fi
done
done
//输出排序后的数组
echo "排序后的数组为:${arr[*]}"
直接选择排序
- 基本思想
- 将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式
#!/bin/bash
read -p "请输入一个数组列表:" list
arr=($list)
length=${#arr[@]}
//输出从键盘输入的原数组元素
echo "原数组的顺序为:${arr[@]}"
for ((i=1;i<$length;i++))
以上是关于shell之数组的主要内容,如果未能解决你的问题,请参考以下文章