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  $?

 原文:https://www.cnblogs.com/jjzd/p/6734354.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM