shell數組應用

轉載:https://www.cnblogs.com/jjzd/p/6734354.html

shell數組應用

引言

  在Linux平臺上工作,我們經常需要使用shell來編寫一些有用、有意義的腳本程序。有時,會經常使用shell數組。那麼,shell中的數組是怎麼表現的呢,又是怎麼定義的呢?接下來逐一的進行講解,shell中的數組。

數組的定義

  何爲數組?學過計算機編程語言的同學都知道,數組的特性就是一組數據類型相同的集合(不包括有一些編程語言提出來的關聯數組的概念)。那麼shell中數組是怎麼定義的呢,我們來看兩種數據類型:一是數值類型,二是字符串類型;雖然shell本身是弱類型的,但也可以這麼區分。

  數值類型的數組:一對括號表示數組,數組中元素之間使用“空格”來隔開。

  舉個列子: 

  arr_number=(1 2 3 4 5);

  字符串類型數組:同樣,使用一對括號表示數組,其中數組中的元素使用雙引號或者單引號包含,同樣使用“空格”來隔開。

  arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');

數組的操作

  我們使用數值類型數組arr_number=(1 2 3 4 5)做爲源數組進行相關的講解:獲取數組長度,讀取某個下標的值,對某個下標賦值,刪除、分配和替換以及遍歷。提一個知識點,我們在shell裏面想獲取某個變量的值,使用$符開頭,如:$a或者${a}即可。

  獲取數組長度

  arr_length=${#arr_number[*]}或${#arr_number[@]}均可,即形式:${#數組名[@/*]} 可得到數組的長度。

  讀取某個下標的值

  arr_index2=${arr_number[2]},即形式:${數組名[下標]}

  對某個下標賦值

  這裏需要提出兩個問題:

    第一個問題是如果該下標元素已經存在,會怎麼樣?

    答:會修改該下標的值爲新的指定值。

    例如:arr_number[2]=100,數組被修改爲(1 2 100 4 5)

    第二個問題是如果指定的下標已經超過當前數組的大小,如上述的arr_number的大小爲5,指定下標爲10或者11或者大於5的任意值會如何?

    答:新賦的值被追加到數組的尾部。

    例如:arr_number[13]=13,數組被修改爲(1 2 100 4 5 13)

  刪除操作

    清除某個元素:unset arr_number[1],這裏清除下標爲1的數組;

    清空整個數組:unset arr_number;

  分片訪問

    分片訪問形式爲:${數組名[@或*]:開始下標:結束下標},注意,不包括結束下標元素的值。

    例如:${arr_number[@]:1:4},這裏分片訪問開始下標爲1到結束下標爲4的值結果輸出爲新數組,但不包括下標爲4的值。

  模式替換

    形式爲:${數組名[@或*]/模式/新值}

    例如:${arr_number[@]/2/98}

  數組的遍歷

    數組遍歷我們使用for語句來演示:

    for v in ${arr_number[@]}; do

      echo $v;

    done

  實現數組逆序輸出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/bin/bash

 

arr=(1 2 3 4 5 6)

let i=0

let j=${#arr[@]}-1

 

for (( i=0;i<j;i++,j-- ))

  do

    tmp=${arr[i]}

    arr[i]=${arr[j]}

    arr[j]=$tmp

done

 

echo ${arr[@]}

 

exit $?

  實現冒泡排序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/bin/bash

#冒泡排序

 

arr=(1 0 9 8 6 7)

 

for (( i=0;i<${#arr[@]};i++ ))

  do

    for (( j=${#arr[@]}-1;j>i;j-- ))

      do

        if [[ ${arr[j]} -lt ${arr[j-1]} ]]; then

          temp=${arr[j]}

          arr[j]=${arr[j-1]}

          arr[j-1]=${temp}

        fi

    done

done

 

echo ${arr[@]}

 

exit $?

   實現選擇排序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#!/bin/bash

#選擇排序

 

arr=(999 0 7 8 7 9 8 9 9 0 9 8 1 2 5 3 2 1 4 5 0 10000 7 65 5)

let length=${#arr[@]}

 

#已排序序列末尾

for (( i=0;i<length-1;i++ ))

  do

  min=$i

  #未排序序列

  for (( j=i+1;j<length;j++ ))

    do

    if [ ${arr[min]} -gt ${arr[j]} ];then

      min=$j

    fi

  done

  if [ $min -ne $i ]; then

     tmp=${arr[min]}

     arr[min]=${arr[i]}

     arr[i]=$tmp

  fi

done

 

echo ${arr[@]}

 

exit $?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章