shell 數組、算法

1、數組的概述

1. 數組的定義

數組(Array)是指有序的元素序列,是用於儲存多個相同類型數據的集合。若將有限個類型相同的變量的集合命名,那麼這個名稱就是數組名。數組是在程序設計中,爲了處理方便,把具備相同類型的若干元素按有序的形式組織起來的一種形式。這些有序排列的同類數據元素的集合稱爲數據。算法

2. 下標的定義

組成數組的各個變量稱爲數組的份量,也稱爲數組的元素,有時也稱爲下標變量。
用於區分數組的各個元素的數字編號稱爲下標。apache

數組:(1 3 5 7 9) 下標: 0 1 2 3 4 

3. 數組的特色

(1)數組是相同數據類型的元素的集合。
(2)數組中的各元素的存儲是有前後順序的,它們在內存中按照這個前後順序連續存放在一塊兒。
(3)數組元素用整個數組的名字和它本身在數組中的順序位置來表示。例如,a[0]表示名字爲a的數組中的第一個元素,a[1]表明數組a的第二個元素,以此類推。數組

4. 數組定義的方法

方法一:
數組名=(value0 value1 value2 ……)bash

[root@localhost ~]# array=(1 3 5 7 9) 

方法二:
數組名:([0]=value0 [1]=value1 [2]=value2 ……)函數

[root@localhost ~]# array=([0]=1 [1]=3 [2]=5 [3]=7 [4]=9) 

方法三:
列表名="value0 value1 value2 ……"
數組名=($列表名)ui

[root@localhost ~]# arr="1 3 5 7 9" [root@localhost ~]# array=($arr) 

方法四:
數組名[0]="value0"
數組名[1]="value1"
數組名[2]="value2"spa

[root@localhost ~]# array[0]=1 [root@localhost ~]# array[1]=3 [root@localhost ~]# array[2]=5 [root@localhost ~]# array[3]=7 [root@localhost ~]# array[4]=9 

5. 元素的類型

數組中元素類型包括數值和字符。
當使用字符類型元素時,需使用" "或' '定義。設計

2、數組的簡單操做

1. 獲取元素列表

使用@或能夠獲取數組中的全部元素。
echo ${array_name[@]}
echo ${array_name[
]}
例如:code

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 [root@localhost ~]# echo ${array[*]} 1 3 5 7 9 

注:在不使用雙引號時,兩者使用方式相同。當輸出元素時使用雙引號,@會將全部元素做爲個體獨立的顯示出來,而*會將全部元素視爲一個總體顯示出來。排序

2. 獲取數據長度

獲取數組長度的方法與獲取字符串長度獲得方法相同,在數組名前加#符號。
echo ${#array_name[@]}
echo ${#array_name[*]}
例如:

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 5 [root@localhost ~]# echo ${array[*]} 5 

3. 讀取某下標賦值

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[2]} 5 

4. 數組遍歷

#!/bin/bash array=(1 3 5 7 9) for a in ${array[@]} do echo $a done 
[root@localhost ~]# ./bianli.sh 1 3 5 7 9 

5. 數組切片

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 [root@localhost ~]# echo ${array[@]:0:2} 1 3 [root@localhost ~]# echo ${array[@]:1:3} 3 5 7 [root@localhost ~]# echo ${array[@]:3:3} 7 9 

6. 數組元素替換

臨時替換元素
${數組名[@或*]:需覆蓋字符:替換字符}

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]/3/2} 1 2 5 7 9 [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 

永久替換元素
要實現永久改變原有數組,可經過從新賦值的方式實現

[root@localhost ~]# array=(${array[@]/3/2}) [root@localhost ~]# echo ${array[@]} 1 2 5 7 9 [root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 

7. 數組元素追加

方法一:
array_name[index]=value

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# array[5]=11 [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 11 

方法二:
array_name[${#array_name[@]}]=value

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# array[${#array[@]}]=11 [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 11 

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

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# array=("${array[@]}" 11 13) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 11 13 

注1:雙引號不能省略,不然,當數組array_name中存在包含空格的元素時,會將含有空格的元素按空格拆分紅多個元素
注2:此處不能將「@」替換爲「」,若是替換爲「」,不加雙引號時與「@」的表現一致,加雙引號時,會將數組array_name中的全部元素視爲一個總體做爲一個元素添加到數組中

方法四:
array_name+=(value1 value2 …… valueN)
待添加元素必須用「( )」包圍起來,而且多個元素用空格分隔

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 [root@localhost ~]# array+=(11 13) [root@localhost ~]# echo ${array[@]} 1 3 5 7 9 11 13 [root@localhost ~]# array+=15 [root@localhost ~]# echo ${array[@]} 115 3 5 7 9 11 13 

8. 數組刪除

刪除指定數組

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# unset array [root@localhost ~]# echo ${array[@]} 

刪除指定元素

[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# unset array[2] [root@localhost ~]# echo ${array[@]} 1 3 7 9 

三. 向函數傳數組參數

若是將數組變量做爲函數參數,函數只會取數組變量的第一個值。

test1() { echo "接收到的參數列表:$@" newarray=($1) echo "新數組的值爲:${newarray[@]}" } array=(1 3 5 7 9) echo "原始數組的值爲:${array[*]}" test1 $array 
[root@localhost ~]# ./test1.sh 原始數組的值爲:1 3 5 7 9 接收到的參數列表:1 新數組的值爲:1 

解決這個問題則須要將數組變量的值分解成單個的值,而後將這些值做爲函數參數使用。在函數內部,再將全部的參數從新組合成一個新的數組變量。

test2() { newarray=($(echo $@)) echo "新數組的值爲:${newarray[*]}" } array=(1 3 5 7 9) echo "原始數組的值爲:${array[*]}" test2 ${array[*]} 
[root@localhost ~]# ./test2.sh 原始數組的值爲:1 3 5 7 9 新數組的值爲:1 3 5 7 9 

4、數組排序算法

1. 冒泡排序

相似氣泡上涌的動做,會將數據在數組中從小到大或者從大到小不斷的向前移動。

(1)基本思想

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

(2)算法思路

冒泡算法由雙層循環實現,其中外部循環用於控制排序輪數,通常爲要排序的數組長度減1次,由於最後一次循環只剩下一個數組元素,不須要對比,同時數組已經完成排序了。而內部循環主要用於對比數組中每一個相鄰元素的大小,以肯定是否交換位置,對比和交換次數隨排序輪數而減小。

(3)腳本編寫

#!/bin/bash arr=(20 60 40 30 10 10) echo "原始數組的順序爲:${arr[@]}" #獲取數組的長度 length=${#arr[@]} #外層循環定義比較的輪數,輪數爲數組長度減一,從1開始 for ((a=1; a<$length; a++)) do #肯定比較相鄰兩個元素的位置,較大的日後放,而且每輪比較的最後一個元素下標遞減 #這裏使用變量b表明座標比較元素的下標範圍 for ((b=0; b<$length-a; b++)) do #定義左邊比較的元素的值 left=${arr[$b]} #定義右邊比較的元素的值 c=$[$b + 1] right=${arr[$c]} #若是左邊的元素比右邊的元素的值大,就互換元素的位置,若須要降序排列就改成-lt if [ $left -gt $right ];then #把左邊元素的值保存到臨時變量tmp中 tmp=$left #把右邊元素的值賦給左邊的元素 arr[$b]=$right #將保存在臨時變量中的值賦給右邊的元素 arr[$c]=$tmp fi done done echo "原始數組從小到大的排列爲:${arr[@]}" 
[root@localhost ~]# ./qipao.sh 原始數組的順序爲:20 60 40 30 10 10 原始數組從小到大的排列爲:10 10 20 30 40 60 

2. 直接選擇排序

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

(1)基本思想

將指定排序位置與其餘數組元素分別對比,若是知足條件就交換元素值,注意這裏區別冒泡排序,不是交換相鄰元素,而是把知足條件的元素與指定的排序位置交換(如從最後一個元素開始排序),這樣排序好的位置逐漸擴大,最後整個數組都成爲已排序好的格式。

(2)腳本編寫

#!/bin/bash arr=(20 50 40 30 60 10) echo "原始數組的順序爲:${arr[*]}" length=${#arr[*]} for ((a=1; a<$length; a++)) do #先假設下標爲0的元素值最大 index=0 #經過比較獲取擁有最大值的下標(索引) for ((b=1; b<=$length-$a; b++)) do left=${arr[$index]} right=${arr[$b]} if [ $right -gt $left ];then index=$b fi done #把最大元素的值跟當前輪次最後一個元素的值進行交換 last=$[$length-$a] tmp=${arr[$last]} arr[$last]=${arr[$index]} arr[$index]=$tmp done echo "排序後的數組的順序爲 ${arr[*]}" 
[root@localhost ~]# ./zhijie.sh 原始數組的順序爲:20 50 40 30 60 10 排序後的數組的順序爲 10 20 30 40 50 60 

3. 反轉排序

以相反的順序把原有數組的內容從新排序

(1)基本思想

把數組最後一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,一次類推,直到把全部數組元素反轉替換。

#!/bin/bash arr=(1 2 3 4 5 6 7) echo "原始的數組順序爲:${arr[@]}" length=${#arr[@]} for ((a=0; a<$length/2; a++)) do tmp=${arr[$a]} arr[$a]=${arr[$length-$a-1]} arr[$length-1-$a]=$tmp done echo "反轉排序後的數組順序爲:${arr[@]}" 
[root@localhost ~]# ./fanzhuan.sh 原始的數組順序爲:1 3 5 7 9 反轉排序後的數組順序爲:9 7 5 3 1
相關文章
相關標籤/搜索