Shell中的數組及其相關操做

http://blog.csdn.net/jerry_1126/article/details/52027539編程

Shell中數據類型很少,好比說字符串,數字類型,數組。數組是其中比較重要的一種,其重要應用場景,能夠求數組長度,元素長度,遍歷其元素,元素切片,替換,刪除等操做,使用很是方便。數組

Shell中的數組不像JAVA/C,只能是一維數組,沒有二維數組;數組元素大小無約束,也無需先定義數組的元素個數;但其索引則像JAVA/C/Python,從0開始,下面其經常使用的方式進行總結.編程語言

 

數組聲明函數

 

備註:post

1) 不像JAVA/C等強編程語言,在賦值前必須聲明;SHELL只是弱編程語言,可事先聲明也可不聲明;spa

2) 用unset來撤銷數組,可用unset array_name[i]來刪除裏面的元素.net

 

數組定義blog

備註:排序

 

1) 數組中的元素,必須以"空格"來隔開,這是其基本要求;索引

2) 定義數組其索引,能夠不按順序來定義,好比說:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy);

3)字符串是SHELL中最重要的數據類型,其也可經過($str)來轉成數組,操做起來很是方便;

 

數組長度

 

備註:

1) 使用${array_name[@]} 或者 ${array_name[*]} 均可以所有顯示數組中的元素

2) 一樣道理${#array_name[@]} 或者 ${#array_name[*]}均可以用來求數組的長度

3)求數組中元素的長度方法有不少,至關於求字符串的長度

 

數組遍歷

腳本輸出:

 


備註:

1) 可使用標準的for循環,這種類C語言的方式來遍歷數組中的元素

2) for 元素 in 元素集(數組) 這種類Python的方式來遍歷數組

3)從代碼可讀性與執行速度來看,推薦使用第二種方式

 

數組賦值


 

備註:

1) 第一種是給已經存在的元素項從新賦值

2) 固然也能夠給不存在的索引添加賦值,能夠看下面的示例

 

數組添加

 

數組切片

數組切片

元素切片

備註:

1) 通用的格式${array[@]:起始位置:長度},中間以":"隔開,若是第二項省略的話,就取後面全部的項

2) 切片後返回的是字符串,能夠經過 新數組=(${舊數組[@]:索引:長度})來索引,參見上面最後一個例子

3) 區別於Python之一:起始位置能夠爲負數,但必須以放在()中,長度不能爲負數

4)區別於Python之二:第二項在Python裏面是結束索引,在Shell則表明所取元素的長度

5) 區別於Python之三:Python能夠經過 list[-1:-4:-2]來反向取數,在Shell則實現不了

 

數組替換

${array[@]/x/y}     最小匹配替換,每一個元素只替換一次

${array[@]//x/y}    最大匹配替換,每一個元素可替換屢次

${array[@]/x/}      最小匹配刪除,只刪除一個符合規定的元素

${array[@]//x/}     最大匹配刪除,可刪除多個符合規定的元素


 

${array[@]/#x/y}     從左往右匹配替換,只替換每一個元素最左邊的字符

${array[@]/%x/y}     從右往左匹配替換,只替換每一個元素最右邊的字符

 

數組刪除

#  每一個元素,從左向右進行最短匹配
## 每一個元素,從左向右進行最長匹配
%  每一個元素,從右向左進行最短匹配
%% 每一個元素,從右向左進行最長匹配


 

數組應用

示例一: 將ifconfig命令取到的本地IP: 127.0.0.1逐行顯示出來

腳本輸出:

示例二: 模擬堆棧的push,pop,shift,unshift操做

腳本輸出:

示例三: 在1-10間,隨機生成10個不重複的數,將其放置於數組中

腳本輸出:

 

備註:

1) 生成[1,10]範圍內不重複的隨機整數,並保存到數組array中

2) seq 1 10 用於生成1~10的整數序列(包含邊界值1和10)

3) awk中的rand()函數用於隨機產生一個0到1之間的小數值(保留小數點後6位)

4)rand()只生成一次隨機數,要使用srand()函數使隨機數滾動生成

5) 括號裏留空即默認採用當前時間做爲隨機計數器的種子,這樣以秒爲間隔,隨機數就能滾動隨機生成了

6) 因爲以秒爲間隔,因此若是快速連續運行兩次腳本(1s內),你會發現生成的隨機數仍是同樣的

示例四: 將字符串處理後轉爲爲數組,再對其打印輸出

腳本輸出:

示例五: 用read -a參數,從標準輸入中讀取數組,再作操做

腳本輸出:

示例六:  判斷某個變量,是否在數組中,在輸出YES,否輸出NO

腳本輸出:

示例七:  對數組中的元素進行排序


示例八:  將/etc/passwd文件中以:分隔的第一列,即用戶名放置於一個數組中

示例九:  將1-8,每一個數自乘後輸出 

腳本輸出:

示例十:  藉助數組來設置SHELLS的環境變量 

示例十一:  設置IFS,讀取文件內容示例

示例十二:  利用eval,模擬實現數組的功能

腳本輸出:

示例十三:  利用數組來實現冒泡排序

思路:會重複地走訪過要排序的數組,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。越大的元素會經由交換慢慢「浮」到數列的頂端

腳本輸出:

示例十四:  利用數組來求最大值

腳本輸出

相關文章
相關標籤/搜索