Shell编程之数组

一、数组定义的方法

方法1

数组名=(value0 value1 value2 …)

方法2

数组名=[0]=value [1]=value [2]=value )

方法3

列表名=“value0 value1 value2 …”
数组名=($列表名)

方法4

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

二、数组的相关概述

1.数组包括的数据类型

(1)数值类型
(2)字符类型(字符串)
使用" " 或 ’ ’ 定义,防止元素当中有空格,元素按空格分割

2.获取数组长度

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

3.获取数据列表

echo ${arr_number[*]}

echo ${arr_number[@]}

4.读取某个下标赋值

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

实操
数组1

三、数组的操作

1.数组遍历

遍历

2.数组切片

echo ${arr1[@]:2:1}   #获取 ${数组名[@或*]:起始位置:长度} 的值

切片
注:切片是重新输出数组,即使下标一开始没有赋值,也不会影响输出

3.数组替换

格式:${数组名[*或@]/源参数值/将要替换的参数值}
arr2=(1 2 3 4 5)
#临时替换:将数组arr1中的参数值3替换为66,但原来的数组中的参数值并不会改变
echo ${arr2[*]/3/66}     
echo ${arr2[*]}

#永久替换:可通过重新赋值实现
arr2=(${arr2[*]/3/66})   
echo ${arr2[*]}

实操1,临时替换和永久替换
替换
实操2,数组中两个60,替换第一个
替1

4.数组删除

格式:unset 数组名[索引]     #删除单个
      unset 数组名          #删除整个数组

删除

5.数组追加元素

方法1 :单个添加,需要知道数组中有多少参数,以及没有对数组进行任何删减

举例
arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4[7]=8          #指定索引添加参数
echo ${arr4[*]}

1

方法2:利用数组长度来增加

arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4[${#arr4[*]}]=8  #根据长度添加参数
echo ${arr4[*]}

2
注:特殊情况如果在定义数组时,中间缺了下标,则不能使用

方法3:直接获取源数组的全部元素再加上新要添加的元素,一并重新赋予该数组,重新刷新定义索引(用$@)

arr4=(1 2 3 4 5 6 7)
echo ${arr4[*]}
arr4=("${arr4[@]}" 8 9 10)  #加上新参数重新定义数组
echo ${arr4[*]}
双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“* ”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

3

补充:$ @和$*的区别

$@和$*的区别
定义时不加""两者没有区别
加上""
$* 将数组中的数据作为一个整体使用
$@ 将数组中每个参数分别作为单个的个体使用

举例
区别

方法4:待添加元素用“()”包起来,多个元素则用空格分隔

arr5=(1 2 3 4 5 6 7)
echo ${arr5[*]}
arr5+=(8 9 11)   #添加参数,这种方法用的比较多
echo ${arr5[*]}

4

四、数组传参给函数

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

#!/bin/bash 

test1 () {
   echo "函数接受到的参数列表:$@"
   newarr=$@
   echo "函数中新的数组的值为:${newarr[@]}" 
}

arr=(30 20 10 40 50)
echo "原始数组的值为:${arr[*]}"
test1 $arr                       #将数组变量作为函数的参数,只会取数组变量的第一个值

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

#!/bin/bash 

test1 () {
   echo "函数接受到的参数列表:$@"
   newarr=$@
   echo "函数中新的数组的值为:${newarr[@]}" 
}

arr=(30 20 10 40 50)
echo "原始数组的值为:${arr[*]}"
test1 ${arr[*]}

全部输出

五、从函数返回数组

#!/bin/bash

#用于求数组中所有元素的累加和
test2 () {
   newarr1=($@)
   arrlist=${newarr1[*]}
   sum=0

   for i in $arrlist
   do
     sum=$[$sum+$i]
   done
   echo $sum

}

#用于把原数组中所有元素值乘以2后生成一个新的数组并输出
test3 () {
    newarr2=($@)
    length=${#newarr2[@]}
    for ((j=0;j<=$length-1;j++))
    do
      newarr2[$j]=$[${newarr2[$j]} * 2]
    done
    echo ${newarr2[*]}

}
######main######

arry=(10 20 30 40 50)
echo "原数组的列表为:${arry[@]}"
res1=`test2 ${arry[@]}`
echo "test1中的新数组的累加和为:$res1"

实操
返回1
结果

六、排序算法

1.冒泡排序

基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

#!/bin/bash
read -p "请输入一个数组列表:" list
#定义一个初始数组
arr=($list)
echo "原数组的顺序为:${arr[@]}"
#获取数组的长度
length=${#arr[@]}

#冒泡排序
#定义比较轮数,为数组长度减1,并且要从1开始
for ((i=1;i<$length;i++))
do
  #确定每次比较的元素下标,比较相邻2个元素,大的往后放,小的往前放,并且每轮比较的次数要随着轮数递减
  for ((j=0;j<$length-$i;j++))
  do
  #获取第一个元素的值
  first=${arr[$j]}
  #获取第二个元素的值
  k=$[$j+1]
  second=${arr[$k]}
  #比较第一个元素和第二个元素的值,如果第一个元素值大于第二个元素值则两个元素位置交换
  if [ $first -gt $second ]
  then
    #先把第一个元素值保存在临时变量temp中
    temp=${arr[$j]}
    #把第二个元素的值赋给第一个元素
    arr[$j]=$second
    #把原来第一个元素的值赋给第二个元素
    arr[$k]=$temp
  fi
  done
done
 echo "排序后新的数组顺序为:${arr[@]}"

结果1

2.直接选择排序

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

基本思想
将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。

#!/bin/bash

read -p "请输入一个数组列表:" list
arr=($list)
length=${#arr[@]}
echo "原数组的顺序为:${arr[@]}"
for ((i=1;i<$length;i++))
do
  #先假设最大元素下标为0
  index=0
  #用于确定实际最大元素的下标,从第二个元素开始比较,最后一个元素下标随着比较轮数递减
  for ((j=1;j<=$length-$i;j++))
  do
    if [ ${arr[$j]} -gt ${arr[$index]} ]
    then
        index=$j
    fi
  done

  #在确定好当前轮次最大元素下标后,开始最大元素的值和当前轮次最后一个元素进行交换
  last=$[$length-$i]
  temp=${arr[$last]}
  arr[$last]=${arr[$index]}
  arr[$index]=$temp

done
  echo "排序后的新数组的顺序为:${arr[@]}"

结果2

3.反转排序

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

基本思想:
把数组最后一个元素与第一个元素替换。倒数第二个元素与第二个元素替换,以此类推,直到把所有的数组元素反转替换完

#!/bin/bash

read -p "请输入一个数组列表:" list

arr=($list)
length=${#arr[*]}
echo "反转前数组的顺序为:${arr[*]}"

for ((i=0;i<$length/2;i++))
do
  temp=${arr[$i]}
  arr[$i]=${arr[$length-1-$i]}
  arr[$length-1-$i]=$temp
done
echo "反转排序后新数组顺序为:${arr[*]}"

结果3

总结

(1)数组概念及3种排序方法(冒泡排序、直接选择排序、反转排序)
(2)注意数组定义时,一开始下标没有赋值时,数组切片时,数组会重新进行排序,正常输出(下标从0开始)
(3)利用数组长度来增加数组元素时,如果在定义数组时,中间缺了下标,则不能使用。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Shell字符串数组是一种存储多个字符串的数据结构,可以通过下标访问数组中的元素,也可以通过循环遍历数组中的所有元素。在Shell脚本中,可以使用declare命令或者直接赋值的方式来创建字符串数组。例如,使用declare命令创建一个包含三个字符串的数组: declare -a arr=("hello" "world" "shell") 然后可以通过下标访问数组中的元素: echo ${arr[]} # 输出hello 也可以使用循环遍历数组中的所有元素: for i in "${arr[@]}" do echo $i done 输出结果为: hello world shell ### 回答2: Shell中的字符串数组是一种特殊的变量类型,用于存储多个字符串。在Shell脚本中,字符串数组可以用于存储一系列相关的字符串,并且可以对其进行遍历、操作和处理。 定义字符串数组可以使用以下语法: ``` array=("string1" "string2" "string3") ``` 其中,array是数组的名称,而"string1"、"string2"、"string3"是数组中的元素。 也可以逐个添加元素到数组中: ``` array[0]="string1" array[1]="string2" array[2]="string3" ``` 访问数组元素可以使用以下语法: ``` element=${array[index]} ``` 其中,index是数组中元素的索引,element是获取的数组元素。 对于数组的长度,可以使用以下语法: ``` length=${#array[@]} ``` 使用这个语法,可以获取数组中元素的个数。 遍历字符串数组可以使用循环语句: ``` for element in "${array[@]}" do echo $element done ``` 这个例子中,通过遍历${array[@]},我们可以访问数组中的每个元素,并将其打印出来。 使用字符串数组,可以方便地存储和处理一系列相关的字符串数据,从而实现更加灵活和高效的脚本编写。 ### 回答3: Shell字符串数组Shell编程语言中的一种数据结构,它可以存储多个字符串,并通过索引访问和操作。在Shell中,字符串数组可以通过以下方式定义和初始化: ```bash my_array=("string1" "string2" "string3") ``` 上述代码定义了一个名为my_array的字符串数组,其中有三个元素,分别是"string1"、"string2"和"string3"。我们可以通过数组索引来访问特定的元素,如: ```bash echo ${my_array[0]} # 输出第一个元素"string1" echo ${my_array[1]} # 输出第二个元素"string2" echo ${my_array[2]} # 输出第三个元素"string3" ``` 我们还可以通过下标的方式遍历整个数组,并对每个元素进行操作,如: ```bash for element in ${my_array[@]}; do echo $element done ``` 上述代码会将数组中的每个元素逐行输出。 在Shell中,我们可以使用数组来存储需要进行批量处理的数据,方便对多个字符串进行统一操作,比如切割、连接等。同时,字符串数组还可以作为函数的参数传递,方便将多个字符串作为一个整体进行处理。总的来说,Shell字符串数组是一种非常有用的数据结构,可以简化Shell脚本编写,提高代码的可读性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值