Shell中數(shù)組以及其相關操作的詳細實例
Shell中數(shù)據(jù)類型不多,比如說字符串,數(shù)字類型,數(shù)組。數(shù)組是其中比較重要的一種,其重要應用場景,可以求數(shù)組長度,元素長度,遍歷其元素,元素切片,替換,刪除等操作,使用非常方便。
Shell中的數(shù)組不像JAVA/C,只能是一維數(shù)組,沒有二維數(shù)組;數(shù)組元素大小無約束,也無需先定義數(shù)組的元素個數(shù);但其索引則像JAVA/C/Python,從0開始,下面其常用的方式進行總結.
【數(shù)組聲明】
備注:
1) 不像JAVA/C等強編程語言,在賦值前必須聲明;SHELL只是弱編程語言,可事先聲明也可不聲明;
2) 用unset來撤銷數(shù)組,可用unset array_name[i]來刪除里面的元素
【數(shù)組定義】
備注:
1) 數(shù)組中的元素,必須以"空格"來隔開,這是其基本要求;
2) 定義數(shù)組其索引,可以不按順序來定義,比如說:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy);
3)字符串是SHELL中最重要的數(shù)據(jù)類型,其也可通過($str)來轉(zhuǎn)成數(shù)組,操作起來非常方便;
【數(shù)組長度】
備注:
1) 使用${array_name[@]} 或者 ${array_name[*]} 都可以全部顯示數(shù)組中的元素
2) 同樣道理${#array_name[@]} 或者 ${#array_name[*]}都可以用來求數(shù)組的長度
3)求數(shù)組中元素的長度方法有很多,相當于求字符串的長度
【數(shù)組索引】
[root@locathost ~]# s="A,B,C,D" [root@locathost ~]# a=(`echo $s | tr ',' ' '`) # 將字符串轉(zhuǎn)變成數(shù)組 [root@locathost ~]# echo ${!a[@]} # 求數(shù)組中的索引 0 1 2 3
【元素刪除】
[root@localhost ~]# a=(A B C D) [root@localhost ~]# unset a[2] # 刪除索引為2的元素 [root@localhost ~]# echo ${a[@]} # 顯示刪除后的元素 A B D
【數(shù)組遍歷】
腳本輸出:
備注:
1) 可以使用標準的for循環(huán),這種類C語言的方式來遍歷數(shù)組中的元素
2) for 元素 in 元素集(數(shù)組) 這種類Python的方式來遍歷數(shù)組
3)從代碼可讀性與執(zhí)行速度來看,推薦使用第二種方式
【數(shù)組賦值】
備注:
1) 第一種是給已經(jīng)存在的元素項重新賦值
2) 當然也可以給不存在的索引添加賦值,可以看下面的示例
【數(shù)組添加】
【數(shù)組切片】
數(shù)組切片
元素切片
備注:
1) 通用的格式${array[@]:起始位置:長度},中間以":"隔開,如果第二項省略的話,就取后面所有的項
2) 切片后返回的是字符串,可以通過 新數(shù)組=(${舊數(shù)組[@]:索引:長度})來索引,參見上面最后一個例子
3) 區(qū)別于Python之一:起始位置可以為負數(shù),但必須以放在()中,長度不能為負數(shù)
4)區(qū)別于Python之二:第二項在Python里面是結束索引,在Shell則代表所取元素的長度
5) 區(qū)別于Python之三:Python可以通過 list[-1:-4:-2]來反向取數(shù),在Shell則實現(xiàn)不了
【數(shù)組替換】
${array[@]/x/y} 最小匹配替換,每個元素只替換一次
${array[@]//x/y} 最大匹配替換,每個元素可替換多次
${array[@]/x/} 最小匹配刪除,只刪除一個符合規(guī)定的元素
${array[@]//x/} 最大匹配刪除,可刪除多個符合規(guī)定的元素
${array[@]/#x/y} 從左往右匹配替換,只替換每個元素最左邊的字符
${array[@]/%x/y} 從右往左匹配替換,只替換每個元素最右邊的字符
【數(shù)組刪除】
# 每個元素,從左向右進行最短匹配
## 每個元素,從左向右進行最長匹配
% 每個元素,從右向左進行最短匹配
%% 每個元素,從右向左進行最長匹配
【數(shù)組應用】
示例一: 將ifconfig命令取到的本地IP: 127.0.0.1逐行顯示出來
腳本輸出:
示例二: 模擬堆棧的push,pop,shift,unshift操作
腳本輸出:
示例三: 在1-10間,隨機生成10個不重復的數(shù),將其放置于數(shù)組中
腳本輸出:
備注:
1) 生成[1,10]范圍內(nèi)不重復的隨機整數(shù),并保存到數(shù)組array中
2) seq 1 10 用于生成1~10的整數(shù)序列(包含邊界值1和10)
3) awk中的rand()函數(shù)用于隨機產(chǎn)生一個0到1之間的小數(shù)值(保留小數(shù)點后6位)
4)rand()只生成一次隨機數(shù),要使用srand()函數(shù)使隨機數(shù)滾動生成
5) 括號里留空即默認采用當前時間作為隨機計數(shù)器的種子,這樣以秒為間隔,隨機數(shù)就能滾動隨機生成了
6) 由于以秒為間隔,所以如果快速連續(xù)運行兩次腳本(1s內(nèi)),你會發(fā)現(xiàn)生成的隨機數(shù)還是一樣的
示例四: 將字符串處理后轉(zhuǎn)為為數(shù)組,再對其打印輸出
腳本輸出:
示例五: 用read -a參數(shù),從標準輸入中讀取數(shù)組,再做操作
腳本輸出:
示例六: 判斷某個變量,是否在數(shù)組中,在輸出YES,否輸出NO
腳本輸出:
示例七: 對數(shù)組中的元素進行排序
示例八: 將/etc/passwd文件中以:分隔的第一列,即用戶名放置于一個數(shù)組中
示例九: 將1-8,每個數(shù)自乘后輸出
腳本輸出:
示例十: 借助數(shù)組來設置SHELLS的環(huán)境變量
示例十一: 設置IFS,讀取文件內(nèi)容示例
示例十二: 利用eval,模擬實現(xiàn)數(shù)組的功能
腳本輸出:
示例十三: 利用數(shù)組來實現(xiàn)冒泡排序
思路:會重復地走訪過要排序的數(shù)組,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。越大的元素會經(jīng)由交換慢慢“浮”到數(shù)列的頂端
腳本輸出:
示例十四: 利用數(shù)組來求最大值
腳本輸出
總結
到此這篇關于Shell中數(shù)組以及其相關操作的文章就介紹到這了,更多相關Shell數(shù)組操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux中編寫自己的并發(fā)隊列類(Queue 并發(fā)阻塞隊列)
這篇文章主要介紹了linux中編寫并發(fā)隊列類,功能有:并發(fā)阻塞隊列、有超時限制、有大小限制2013-12-12bash腳本如何監(jiān)控cup/內(nèi)存/磁盤使用率
本文主要介紹了bash腳本如何監(jiān)控cup/內(nèi)存/磁盤使用率,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10如何利用 tee 命令調(diào)試shell腳本中的管道
在編寫shell腳本時,調(diào)試是個比較麻煩的事,特別是涉及到多層管道命令的時候,會產(chǎn)生多個中間結果,tee命令的作用是從標準輸入中讀取數(shù)據(jù)寫入標準輸出或文件中,利用它可以從管道中讀取中間結果并寫入本地臨時文件中,通過中間結果可以一步一步的定位到腳本的錯誤2021-05-05Linux命令行循環(huán)執(zhí)行shell命令
這篇文章主要介紹了Linux命令行,循環(huán)執(zhí)行shell命令的相關知識,主要包括死循環(huán),普通計數(shù)循環(huán),以及Linux shell循環(huán)命令 while死循環(huán)的用法,需要的朋友可以參考下2023-01-01