玩玩shell数组

一、索引(下标)

arr=(1 2 3 4 5)
索引 0 1 2 3 4

二、数组

1、数组定义方法

方法一:
数组名=(value0 value1 value2 ...)
[root@localhost ~]#arr1=(1 2 3 4 5)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 5
方法二:
数组名=([0]=value [1]=value [2]=value ...)
[root@localhost ~]#arr1=([0]=1 [1]=2 [2]=3)
[root@localhost ~]#echo ${arr1[*]}
1 2 3
方法三:
列表名="value0 value1 value2 ..."
数组名=($列表名)
[root@localhost ~]#lie="1 2 3 4 "
[root@localhost ~]#arr1=($lie)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4
方法四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
[root@localhost ~]#arr1[0]="3"
[root@localhost ~]#arr1[1]="2"
[root@localhost ~]#arr1[2]="1"
[root@localhost ~]#echo ${arr1[*]}
3 2 1

2、数组包括的数据类型

  • 数值类型
  • 字符类型:
    使用""或’'定义
[root@localhost ~]#arr1=(1 2 3 4 "sad" 'df')
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 sad df

3、获取数组长度

echo ${#数组名[*]}echo ${#数组名[@]}
[root@localhost ~]#arr1=(1 2 3 4 5)
[root@localhost ~]#echo ${arr1[*]}
1 2 3 4 5
[root@localhost ~]#echo ${#arr1[*]}
5

4、读取某索引(下标)赋值

echo ${arr1[索引]}
[root@localhost ~]#arr1=(1 2 3 4 5)
                         0 1 2 3 4
[root@localhost ~]#echo ${arr1[0]}
1

5、数组遍历

[root@localhost ~]#vim arr2.sh
#!/bin/bash
arr2=(1 2 3 4 5)
for v in ${arr2[*]}
do
  echo "$v"
done

[root@localhost ~]#. arr2.sh
1
2
3
4
5

6、数组切片

arr=(1 2 3 4 5)
echo ${arr[*]}   #输出整个数组 (* @)都有代表整个的意思
echo ${arr[@]}
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5
echo ${arr[*]:0:2}  #获取 ${数组名[@或*]:起始位置:长度} 的值
[root@hellozzzq ~]#echo ${arr[*]:0:2}
1 2
#数组arr总长度为5 其中1 2 3 4 5都可以作为起始位置

7、数组替换

arr=(1 2 3 4 5)
echo ${arr[*]/1/100}    #与切片有点像,${数组名[@或*]/查找字符/替换字符} 
[root@hellozzzq ~]#echo ${arr[*]/1/100}
100 2 3 4 5
#替换后是临时的再次输出数组又会变回原有数组
[root@hellozzzq ~]#arr=(${arr[*]/1/100})
[root@hellozzzq ~]#echo ${arr[*]}
100 2 3 4 5
#重新赋值就可以改变原有数组

8、数组删除

unset arr #删除数组

[root@hellozzzq ~]#unset arr
[root@hellozzzq ~]#echo ${arr[*]}

[root@hellozzzq ~]#
unset arr[2]  #删除第三个元素   []输入元素对应的索引
[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#unset arr[2]
[root@hellozzzq ~]#echo ${arr[*]}
1 2 4 5

9、数组追加元素

方法一:数组名[索引]=value
#索引选择现有索引范围外的是追加,选择现有索引就是覆盖。

[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr[5]=3
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 3
[root@hellozzzq ~]#arr[4]=6
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 6 3

方法二:arr[${#arr[*]}]=value
#现有总长度就是最大索引值加1。

[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr[${#arr[*]}]=8
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 8

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

[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr=("${arr[@]}" 10 20 30 40)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 10 20 30 40

方法四:arr+=(10 20 30 40 50)
#待添加元素必须用“()”包围起来,并且多个元素用空格分隔。

[root@hellozzzq ~]#arr=(1 2 3 4 5)
[root@hellozzzq ~]#arr+=(10 20 30 40 50)
[root@hellozzzq ~]#echo ${arr[*]}
1 2 3 4 5 10 20 30 40 50

10、向函数传数组参数

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

[root@hellozzzq ~]#vim dome13.sh
[root@hellozzzq ~]#. dome13.sh
原始数组值为:1 2 3 4 5
接收到的参数列表:1
新数组的值为:1
[root@hellozzzq ~]#vim dome13.sh

#!/bin/bash
test1 () {
    
    
    echo "接收到的参数列表:$@"
    newarr=$1
    echo "新数组的值为:${newarr[*]}"
}

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

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

[root@hellozzzq ~]#. dome14.sh
原始数组值为:1 2 3 4 5
新数组的值为:1 2 3 4 5
[root@hellozzzq ~]#vim dome14.sh

#!/bin/bash
test2 () {
    
    
    newarr=($(echo $@))
    echo "新数组的值为:${newarr[*]}"
}

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

从函数返回数组

[root@hellozzzq ~]#. dome15.sh
原始数组的值为:1 2 3 4 5
新数组的和为:15
[root@hellozzzq ~]#vim dome15.sh

#!/bin/bash

test2() {
    
    
  newarr=(`echo $@`)

  sum=0
  for value in ${newarr[*]}
  do
    sum=$[$sum + $value]
  done
  echo $sum
}

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

三、数组排序算法

冒泡排序法

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

扫描二维码关注公众号,回复: 12429312 查看本文章

初始数组资源 【 20 10 30 60 50 40 】
第一轮 【 20 10 30 50 40 】 60
第二轮 【 20 10 30 40 】 50 60
第三轮 【 20 10 30 】40 50 60
第四轮 【 20 10 】30 40 50 60
第五轮 【 10 】20 30 40 50 60

#!/bin/bash  
abc=(20 30 10 60 50 40)   #定义数组                              
length=${#abc[*]}         #获取数组长度

#外for循环定义排序轮数 
for ((i=1; i<$length; i++))  
do
  #内for循环找第一个元素的索引
  for ((k=0; k<$length-i; k++))
  do
    
    first=${abc[$k]}
    j=$[$k+1]
     second=${abc[$j]}
    if [ $first -gt $second ]
    then
      temp=$first
      abc[$k]=$second
      abc[$j]=$temp
    fi
  done   
done

echo "排序后数组的排列顺序为${abc[*]}"

直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

初始数组资源 【 20 10 30 60 50 40 】
第一轮 【 20 10 30 40 50 】 60
第二轮 【 20 10 30 40 】 50 60
第三轮 【 20 10 30 】 40 50 60
第四轮 【 20 10 】 30 40 50 60
第五轮 【 10 】 20 30 40 50 60

#!/bin/bash
abc=(20 10 30 60 50 40)
length=${#abc[*]}

for ((i=1; i<$length; i++))
do
 
  index=0
  for ((k=1; k<=$length-i; k++))
  do
    first=${abc[$k]}

    if [ $first -gt ${abc[$index]} ]
    then
      index=$k
    fi

    last=$[$length-$i]
    temp=${abc[$last]}
    abc[$last]=${abc[$index]}
    abc[$index]=$temp
  done
done

echo "排序后数组的排列顺序为${abc[*]}"

反转排序

以相反的顺序把原有数组的内容重新排序。

#!/bin/bash
abc=(1 2 3 4 5 6 7)
length=${#abc[*]}
for ((i=0;i<$length/2;i++))
  do
    temp=${abc[$i]}
    abc[$i]=${abc[$length-$i-1]}
    abc[$length-$i-1]=$temp
  done
 echo "${abc[*]}"

猜你喜欢

转载自blog.csdn.net/weixin_51616026/article/details/111640792
今日推荐