陣列真的不難!!千萬不要給自己錯覺......看完你也明白!!!
文章目錄
一、陣列定義方法
方法一、
陣列名=(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
相關文章
- 看完你也想編寫自己的 react 外掛React
- 不要小瞧陣列陣列
- SAP freelancer夫妻並不難!你也可以!
- 如果不會這兩招,千萬不要說你懂大資料大資料
- 我覺得你可能真的還不會JavaJava
- Promise 你真的用明白了麼?Promise
- 你真的瞭解JS陣列的那些方法嗎?JS陣列
- 資料視覺化的基本流程是怎樣的,看完這篇你就明白視覺化
- MySQL索引-B+樹(看完你就明白了)MySql索引
- 你值得擁有的6款檔案管理軟體,千萬不要錯過哦
- 苦難不會打倒自己
- Linux系統常用的ctrl快捷鍵,也許你真的不會Linux
- 好用的企業網盤工具千萬不要錯過
- JavaScript陣列你都掰扯不明白,簡歷上你敢寫精通JavaScript?JavaScript陣列
- List的擴容機制,你真的明白嗎?
- 陣列容器(ArrayList)設計與Java實現,看完這個你不懂ArrayList,你找我!!!陣列Java
- 介面卡模式:我真的不難模式
- 千萬不要給女朋友解釋 什麼是 “羊群效應”
- Python之難點元類|一句話給你安排的明明白白Python
- 別低估自己的直覺,也別高估自己的智商
- 微信H5視訊抓娃娃,沒你想的那麼難,看完你也會H5
- Linux核心版本控制方案給你講明白Linux
- 方法到位,Linux也不難學會Linux
- 看完這篇文章,你就明白運維監控體系了運維
- CTQ難理解?這樣說你就明白了
- 保姆級教程,透視分析真的不難
- 面試三十三題!說實話,中高階面試題看完解析後也不怎麼難!面試題
- 陣列方法不混淆陣列
- Checkbox 陣列 不更新陣列
- 不要問程式設計師什麼是“物件”,也不要給他介紹“物件”程式設計師物件
- 程式猿修仙之路--資料結構之你是否真的懂陣列?資料結構陣列
- 一張圖告訴你,選擇企業安全軟體真的不難!
- 關於Web前端面試的小技巧,千萬不要錯過!Web前端面試
- 給我半首歌的時間,給你說明白Immutable List
- 什麼是NoSQL?這裡給你整明白SQL
- 網站CDN加速是什麼? 看完這篇你就明白了!網站
- 蘋果iPhone Xs系列為什麼不值得買?看完這篇看完你就明白了蘋果iPhone
- 沒有列存的MySQL千萬級分析也能支援MySql