數組(Array)是指有序的元素序列,是用於儲存多個相同類型數據的集合。若將有限個類型相同的變量的集合命名,那麼這個名稱就是數組名。數組是在程序設計中,爲了處理方便,把具備相同類型的若干元素按有序的形式組織起來的一種形式。這些有序排列的同類數據元素的集合稱爲數據。算法
組成數組的各個變量稱爲數組的份量,也稱爲數組的元素,有時也稱爲下標變量。
用於區分數組的各個元素的數字編號稱爲下標。apache
數組:(1 3 5 7 9) 下標: 0 1 2 3 4
(1)數組是相同數據類型的元素的集合。
(2)數組中的各元素的存儲是有前後順序的,它們在內存中按照這個前後順序連續存放在一塊兒。
(3)數組元素用整個數組的名字和它本身在數組中的順序位置來表示。例如,a[0]表示名字爲a的數組中的第一個元素,a[1]表明數組a的第二個元素,以此類推。數組
方法一:
數組名=(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
數組中元素類型包括數值和字符。
當使用字符類型元素時,需使用" "或' '定義。設計
使用@或能夠獲取數組中的全部元素。
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
注:在不使用雙引號時,兩者使用方式相同。當輸出元素時使用雙引號,@會將全部元素做爲個體獨立的顯示出來,而*會將全部元素視爲一個總體顯示出來。排序
獲取數組長度的方法與獲取字符串長度獲得方法相同,在數組名前加#符號。
echo ${#array_name[@]}
echo ${#array_name[*]}
例如:
[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[@]} 5 [root@localhost ~]# echo ${array[*]} 5
[root@localhost ~]# array=(1 3 5 7 9) [root@localhost ~]# echo ${array[2]} 5
#!/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
[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
臨時替換元素
${數組名[@或*]:需覆蓋字符:替換字符}
[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
方法一:
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
刪除指定數組
[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
相似氣泡上涌的動做,會將數據在數組中從小到大或者從大到小不斷的向前移動。
冒泡排序的基本思想是對比相鄰的兩個元素值,若是知足條件就交換元素值,把較小(大)的元素移動到數組前面,把大(小)的元素移動到數組後面(也就是交換兩個元素的位置),這樣較小(大)的元素就像氣泡同樣從底部上升到頂部。
冒泡算法由雙層循環實現,其中外部循環用於控制排序輪數,通常爲要排序的數組長度減1次,由於最後一次循環只剩下一個數組元素,不須要對比,同時數組已經完成排序了。而內部循環主要用於對比數組中每一個相鄰元素的大小,以肯定是否交換位置,對比和交換次數隨排序輪數而減小。
#!/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
與冒泡排序相比,直接選擇排序的交換次數更少,因此速度會快些。
將指定排序位置與其餘數組元素分別對比,若是知足條件就交換元素值,注意這裏區別冒泡排序,不是交換相鄰元素,而是把知足條件的元素與指定的排序位置交換(如從最後一個元素開始排序),這樣排序好的位置逐漸擴大,最後整個數組都成爲已排序好的格式。
#!/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
以相反的順序把原有數組的內容從新排序
把數組最後一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,一次類推,直到把全部數組元素反轉替換。
#!/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