1. 程式人生 > >【Linux】Shell - 陣列操作

【Linux】Shell - 陣列操作

Shell中資料型別不多,比如說字串,數字型別,陣列。

陣列是其中比較重要的一種,其重要應用場景,可以求陣列長度,元素長度,遍歷其元素,元素切片,替換,刪除等操作,使用非常方便。

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


陣列宣告


備註:

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

2) 用unset來撤銷陣列,可用unset array_name[i]來刪除裡面的元素



陣列定義


備註:

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,模擬實現陣列的功能


指令碼輸出:



示例十:  利用陣列來實現氣泡排序

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


指令碼輸出:



示例十:  利用陣列來求最大值


指令碼輸出



參考文章: http://blog.csdn.net/jerry_1126/article/details/52027539