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 Linux Shell
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
49 0
|
2月前
|
Shell C++ 开发者
【Shell 编程指南】Shell运算操作符之$[]详解
【Shell 编程指南】Shell运算操作符之$[]详解
18 0
|
3月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
61 0
|
13天前
|
监控 Shell 开发工具
Shell编程
Shell编程
|
28天前
|
人工智能 机器人 Shell
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)
【shell】shell数组的操作(定义、索引、长度、获取、删除、修改、拼接)
|
2月前
|
存储 Java Shell
bigdata-04-shell编程基础
bigdata-04-shell编程基础
19 0
|
2月前
|
Shell Linux C++
【Shell 编程设计】 编写自己的清理后台的Shell脚本
【Shell 编程设计】 编写自己的清理后台的Shell脚本
33 1
|
2月前
|
存储 Shell 数据安全/隐私保护
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
29 0
|
2月前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
2月前
|
Shell 程序员 Linux
【Shell 编程指南】shell运算操作符之(())
【Shell 编程指南】shell运算操作符之(())
19 0