shell编程之数组

简介: shell编程之数组

数组

一、数组的定义方法

数组的作用:一次性定义多个变量

方法1

数组名=(value0 valuel value2 …)
  • 举例
[root@localhost opt]# arr=(1 2 3 4 5 6)
[root@localhost opt]# echo ${arr[*]}
1 2 3 4 5 6

方法2

数组名=( [0]=value [1]=value [2]=value …)
  • 举例
[root@localhost opt]# arr=([0]=1 [1]=2 [2]=3)
[root@localhost opt]# echo ${arr[*]}
1 2 3

方法3

列表名=“value0 valuel value2 …”
数组名=($列表名)
  • 举例
[root@localhost opt]# list="1 2 3 4"
[root@localhost opt]# arr2=($list)
[root@localhost opt]# echo ${arr2[*]}
1 2 3 4

方法4

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
  • 举例
[root@localhost opt]# arr3[0]="1"
[root@localhost opt]# arr3[1]="2"
[root@localhost opt]# arr3[2]="3"
[root@localhost opt]# echo ${arr3[*]}
1 2 3

二、数组包括的数据类型

  • 数值类型:a=( 1 2 3)
  • 字符类型:b=( x y z)

使用" "或‘ ’定义

三、获取数组长度

[root@localhost opt]# arr=(1 2 3 4 5 6)
[root@localhost opt]# echo ${#arr[*]}   #也就是数组中总共多少个元素
6

四、读取下标索引的值

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@loaclhost opt]# echo ${arr1[0]}      #获取索引为0的元素,即第一个元素
1
[root@loaclhost opt]# echo ${arr1[3]}      #获取索引为3的元素,即第四个元素
4

**注意:**下标索引从0开始

五、数组遍历

[root@localhost opt]# vim shuzu.sh 
a=(1 2 3 4 5 6 aa bc def gg)
for i in ${a[*]}
do
echo $i
done

image.png

六、数组切片

含义:取数组中的某一段的元素的值

格式
${数组名[@或*]:起始位置(起始索引):长度}
  • 示例
[root@localhost opt]# arr1=(1 2 3 4 5)
[root@localhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@localhost opt]# echo ${arr1[*]:0:2}   #这里是从0索引开始获得往后两位元素的值
1 2
[root@localhost opt]# echo ${arr1[*]:2:2}   #获取从索引2开始往后的两位元素的值
3 4

七、数组替换

格式
${数组名[@或*]/查找字符/替换字符}

7.1 临时替换

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@localhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# echo ${arr1[*]/4/66}     #将数组arr1中的元素4替换为66,这只是临时替换,并不是永久替换
1 2 3 66 5
[root@loaclhost opt]# echo ${arr1[*]}          #原来的数组中的元素的值并不会改变
1 2 3 4 5 

7.2 永久替换

[root@loaclhost opt]# arr1=(${arr1[*]/4/66})    #如果想要永久替换的话,可通过重新赋值实现
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 66 5

八、删除数组

8.1 使用unset删除数组

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@localhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# unset arr1
[root@loaclhost opt]# echo ${arr1[*]}

8.2 删除数组中的某个索引对应的元素的值

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# unset arr1[2]       #删除索引2的对应的元素值
[root@loaclhost opt]# echo ${arr1[*]}
1 2 4 5

九、追加数组中的元素

方法1

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# arr1[5]=6          #此时追加数组索引5对应的元素值为6
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5 6

方法2

[root@loaclhost opt]# arr1[${#arr1[*]}]=7   #当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了
[root@loaclhost opt]# echo ${arr1[*]} 
1 2 3 4 5 6 7

方法3

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# arr1=("${arr1[@]}" 6 7)
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5 6 7

双引号不能省略,否则,当数组arr1中存在包含空格的元素时会按空格将元素拆分成多个。

不能将“@“替换为“ * ”,如果替换为" * “,不加双引号时与”@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。

可以简单的理解为:用 * 号是作为一个整体,而用 @ 还是单个的个体。

方法四

[root@loaclhost opt]# arr1=(1 2 3 4 5)
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5
[root@loaclhost opt]# arr1+=(7 8)     #待添加元素必须用“()"包围起来,并且多个元素用空格分隔
[root@loaclhost opt]# echo ${arr1[*]}
1 2 3 4 5 7 8

十、数组给函数传参

示例一:获取数组的数据列表作为函数的参数使用

  • 法一
[root@localhost opt]# vim shuzu1.sh 
xyz () {
abc1=($(echo $@))       #$@会把每个变量的值单独处理
echo "数组的值:${abc1[*]}"
}
abc=(`seq 1 10`)
xyz ${abc[*]}
  • 法二
[root@localhost opt]# vim shuzu1.sh 
xyz () {
abc1=(`echo $@`)
echo "数组的值:${abc1[*]}"
}
abc=(`seq 1 10`)
xyz ${abc[*]}

image.png

示例2:函数返回数组,求和

[root@localhost opt]# vim shuzu2.sh 
test () {
abc1=(`echo $@`)
sum=0
for i in ${abc1[*]}
do
sum=$(($sum+$i))
done
echo "$sum"
}
abc=(1 2 3 4 5)
test ${abc[*]}

image.png

示例三:将数组中的每一个数*2

[root@localhost opt]# vim shuzu3.sh 
test () {
abc1=(`echo $@`)
for  ((i=0;i<=$(($#-1));i++))
do
abc1[$i]=$((${abc1[$i]}*2))
done
echo "${abc1[*]}"
}
abc=(1 2 3 4 5 6)
test ${abc[*]}

image.png

十一、冒泡排序

[root@localhost opt]# vim maopaopaixu.sh 
abc=(20 10 60 40 70 50)
len=${#abc[*]}            #获取数组长度
for ((i=1;i<$len;i++))        #最后一位不用比较,所以用<
do
  for  ((k=0;k<$len-1;k++))     #索引
  do
    first=${abc[$k]}        #取第一个值
    j=$(($k+1))           #当先索引号加一
    second=${abc[$j]}       #取第二个值
  if [ $first -gt $second ]     #比较大小并交换次序
  then
    temp=$first
    abc[$k]=$second
    abc[$j]=$first
  fi
  done
done
echo ${abc[*]}

image.png



目录
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1月前
|
存储 Shell
Shell 数组
【10月更文挑战第16天】
31 3
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
27天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Shell
Shell编程(下)
Shell编程(下)
92 1
|
1月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
41 1
|
1月前
|
Shell PHP 索引
Shell 数组
10月更文挑战第2天
23 1
|
1月前
|
Shell Linux 开发工具
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
70 12
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余