陣列真的不難!!千萬不要給自己錯覺......看完你也明白!!!

女孩和貓發表於2020-12-28


在這裡插入圖片描述

一、陣列定義方法

方法一

陣列名=(value0 value1 value2 ...)

在這裡插入圖片描述

方法二

陣列名=([0]=value [1]=value [2]=value ...)

在這裡插入圖片描述
方法三

列表名="value0 value1value2 ...."
陣列名=($列表名)

在這裡插入圖片描述
方法四

陣列名[0]="value"
陣列名[1]="value" 
陣列名[2]="value"

在這裡插入圖片描述

檢視陣列 echo ${陣列名[*]}

二 、陣列包括的資料型別

  • 數值型別
  • 字元型別:
    字元型別一定要使用" "或‘ ’定義否則會有空格

三、獲取陣列長度

[root@192 shuzu]#arr1=(1 2 3 4 5)
[root@192 shuzu]#echo ${#arr1[*]}      #也就是陣列中總共多少個元素
5

四、讀取某下標賦值

abc=(11 22 33 44 55)
echo ${abc[*]}    #例如echo ${abc[0]}就是獲取索引為0的元素,即第一個元素 為11
1

在這裡插入圖片描述

五、陣列切片

arr=(1 2 3 4 5)

echo ${arr[@]}          輸出整個陣列

echo ${arr[@]:0:2}    獲取${陣列名[@或*]:起始位置:長度}的值

echo ${arr[@]:2:3}

在這裡插入圖片描述

六、陣列替換

格式:
$(陣列名[@或*]/查詢字元/替換字元}

arr=(1 2 3 4 5)

echo ${arr[@]/4/66}         $(陣列名[@或*]/查詢字元/替換字元)

echo ${arr[@]}              不會替換陣列原有內容

arr=(${arr[@]/4/66})        要實現改變原有陣列,可通過重新賦值實現
 
echo ${arr[@]}              相當於創造了一個新的陣列

在這裡插入圖片描述

七、陣列刪除

使用unset刪除陣列

[root@192 ~]#abc=(1 2 3 4 5 65)
[root@192 ~]#unset abc
[root@192 ~]#echo ${abc[*]/3/33}

刪除陣列中的某個索引對應的元素的值

[root@192 ~]#abc=(1 2 3 4 5 65)
[root@192 ~]#echo ${abc[*]}
1 2 3 4 5 65
[root@192 ~]#unset abc[2]     #刪除索引2的對應的元素值
[root@192 ~]#echo ${abc[*]}
1 2 4 5 65

八、追加陣列中的元素

要在陣列中原有的元素後面再追加一些元素的話,可以使用如下方法實現追加:
方法一:

array_name [index]=value
   陣列名    索引號  元素

在這裡插入圖片描述

方法二、

array_name[${#array_name [@]}]=value

在這裡插入圖片描述
#當陣列的元素非常多的時候,可以直接使用陣列的長度作為自己將要追加的索引的值,這樣就可以直接追加元素了。
因為原始陣列的索引是從0開始的,所以用長度減去1就是原始陣列的最後的以為索引值了,那麼自己將要新增的值應該是原始索引值的後一位,那顯然就等於陣列的長度值了。

方法三、
格式: array_name=("${array_name[@]}" value1… valueN)

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

雙引號不能省略,否則,當陣列arr1中存在包含空格的元素時會按空格將元素拆分成多個。
不能將“@“替換為“ * ”,如果替換為" * “,不加雙引號時與”@"的表現一致,加雙引號時,會將陣列arr1中的所有元素作為一個元素新增到陣列中。
可以簡單的理解為:用 * 號是作為一個整體,而用@還是單個的個體。

[root@192 shuzu1]#abc=(1 2 3 4 5)
[root@192 shuzu1]#echo ${abc[*]}
1 2 3 4 5
[root@192 shuzu1]#abc=("${abc[@]}" 6 7 8)
[root@192 shuzu1]#echo ${abc[*]}
1 2 3 4 5 6 7 8
[root@192 shuzu1]#for i in ${abc[*]}
> do
> echo $i
> done
1
2
3
4
5
6
7
8
--------------------------------------------------------------------------------
[root@192 shuzu1]#abc1=(1 2 3 4 5)
[root@192 shuzu1]#echo ${abc1[*]}
1 2 3 4 5
[root@192 shuzu1]#abc1=("${abc1[*]}" 6 7 8)
[root@192 shuzu1]#echo ${abc1[*]}
1 2 3 4 5 6 7 8
[root@192 shuzu1]#for i in "${abc1[@]}";do echo $i;done
1 2 3 4 5
6
7
8

方法四、

格式   array_name+=(value1  ... valueN)

在這裡插入圖片描述

==待新增元素必須用"()"包圍起來,並且多個元素用空格分隔 ==

九、向函式傳陣列引數

1、如果將陣列變數作為函式引數,函式只會取陣列變數的第一個值。

#!/bin/bash
#這是錯誤的做法
test1 () {

echo "接收到的引數列表: $@"

newarrary=($1)               ####這邊定義一個陣列一定要加括號

echo "新陣列的值為: ${newarrary[*]}"

}

array=(3 2 1 4 5)

echo "原始陣列的值為: $(array[*]}"

test1 $array

解決這個問題則需要將陣列變數的值分解成單個的值,然後將這些值作為函式引數使用。在函式內部,再將所有的引數重新組合成一個新的陣列變數。

2、解決這個問題則需要將陣列變數的值分解成單個的值,然後將這些值作為函式引數使用。在函式內部,再將所有的引數重新組合成一個新的陣列變數。
如下:

[root@192~ shuzu1]#vim c.sh
#!/bin/bash
test2 () {
  abc1=($(echo $@))    或者表示為   abc1=(`echo $@`)

  echo "新陣列的值為:${abc1[*]}"
}

abc=(3 2 1 4 5)
echo "原始陣列的值為:${abc[*]}"
test2 ${abc[*]}                           #將陣列的值分解為單個的值
-------------------------------------------------
[root@192~ shuzu1]#chmod +x c.sh 
[root@192~ shuzu1]#./c.sh 
原始陣列的值為:3 2 1 4 5
新陣列的值為:3 2 1 4 5

10、陣列排序方法

(一)、氣泡排序

類似氣泡上湧的動作,會將資料在陣列中從小到大或者從大到小不斷的向前移動。
在這裡插入圖片描述

基本思想
氣泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到陣列前面,把大的元素移動到陣列後面(也就是交換兩個元素的位置) ,這樣較小的元素就像氣泡一樣從底部上升到頂部。

演算法思路:

冒泡演算法由雙層迴圈實現,其中外部迴圈用於控制排序輪數,一般為要排序的陣列長度減1次,因為最後一次迴圈只剩下一個陣列元素,不需要對比,同時陣列已經完成排序了。而內部迴圈主要用於對比陣列中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少。

[root@192 ~]#vim shuzupaixu.sh

#!/bin/bash

abc=(30 50 10 40 60 20)           #定義陣列賦予元素

echo "原陣列的排列順序為:${abc[*]}"  #輸出現在陣列元素順序

length=${#abc[*]}                #定義原陣列長度為length   也可以不定義 只是方便一些

for ((i=1;i<length;i++))         #進入外部迴圈,比較長度 是 陣列長度 減一
do
   for ((a=0;a<$length-i;a++))   #進入內部迴圈,確定元素的位置,比較相鄰的兩個索引,較大的往後稍,比較次數為長度減一它是隨著輪數減少二減少的  
   do
   first=${abc[$a]}              ##定義第一個元素的值
   b=$[$a+1]                     ##定義第二個元素的索引號
   second=${abc[$b]}             ##定義第二個元素的值

   if [ $first -gt $second ]     #第一個元素和第二個元素比較,如果第一個元素比第二個元素大則互換
     then
        temp=$first              #把第一個元素的值儲存在臨時變數temp中
        abc[$a]=$second          #把第二個元素的值賦給第一個元素
        abc[$b]=$temp            #把原第一個元素的值,賦給第二個元素
   fi                               完成位置互換
done
done

echo "排序後陣列的排序順序為:${abc[*]}"    #輸出排序後陣列的排序順序

在這裡插入圖片描述

(二)、直接選擇排序

與氣泡排序相比,直接選擇排序的交換次數更少,所以速度會快些。

基本思想:

將指定排序位置與其它陣列元素分別對比,如果滿足條件就交換元素值,注意這裡區別氣泡排序,不是交換相鄰元素,而是把滿足條件的元素與指定的排序位置交換(如從最後一個元素開始排序) ,這樣排序好的位置逐漸擴大,最後整個陣列都成為已排序好的格式。

在這裡插入圖片描述

[root@gcc shuzu1]#vim d.sh
#!/bin/bash
abc=(63 4 24 1 3 15)    #定義一個陣列
echo "原陣列的排列順序為${abc[*]}" 
length=${#abc[*]}    #定義原陣列的長度,這裡原陣列的長度為6

for ((i=1;i<$length;i++))   #這裡是定義比較的輪數,比較5次
do
  index=0    #表示從索引0開始比較

  for ((k=1;k<=$length-i;k++))   #這裡是確定用於比較的第一個元素的索引範圍,比如已經定義了從索引0開始了,所以和0進行比較的範
圍就是從索引1-5了
   do
     first=${abc[$k]}   #定義與index相比較的索引的取值為first
    if [ $first -gt ${abc[$index]} ]   #通過將index所在的索引的值與k所在的索引的值進行比較,獲取最大元素的索引位置
    then
        index=$k    #通過比較將較大的數定義到index中,進行下一輪的比較
    fi
       last=$[$length-$i]    #獲取在比較的範圍中的最後一個元素的索引
       temp=${abc[$last]}   #將上一步獲取到的最後一個元素的索引的值儲存到臨時變數temp中
       abc[$last]=${abc[$index]}  #把最大上面for迴圈比較出來的最大元素的值賦值給最後一個元素
       abc[$index]=$temp    #把原來最後一個元素的值賦給原來最大值的位置的元素
   done
done

echo "排序後陣列的排列順序為${abc[*]}"   #輸出排序後的陣列
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[root@gcc shuzu1]#chmod +x e.sh 
[root@gcc shuzu1]#./e.sh 
原陣列的排列順序為63 4 24 1 3 15
排序後陣列的排列順序為1 3 4 15 24 63

(三)、反轉排序

以相反的順序把原有陣列的內容重新排序。

基本思想:
把陣列最後一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,1以此類推,直到把所有陣列元素反轉替換。

[root@192~shuzu1]#vim f.sh
#!/bin/bash
abc=(10 20 30 40 50 60)    #定義一個陣列
echo "反轉前順序:${abc[*]}"  
length=${#abc[*]}    #定義陣列的長度為length

for ((i=0;i<$length/2;i++))   #定義陣列的比較的範圍,因為是兩兩進行比較,所以只需要比較length/2組就行
do
  temp=${abc[$i]}   #定義第一個元素為臨時變數temp
  abc[$i]=${abc[$length-1-$i]}  #將同組的最後一個元素的值賦值給第一個元素,注意因為我們i是從0開始的,所以最後一個元素的索引號是長度減去1之後再減去變數i的值才是最後一個索引的值
  abc[$length-1-$i]=$temp   #將同組的第一個元素的值賦值給最後一個元素
done

echo "反轉排序後:${abc[*]}"
------------------------------------------------------------------------------------------------------
[root@192~shuzu1]#chmod +x f.sh 
[root@192~ shuzu1]#./f.sh 
反轉前順序:10 20 30 40 50 60
反轉排序後:60 50 40 30 20 10

相關文章