bash shell數組使用總結


 

本文為原創博文,轉發請注明原創鏈接https://www.cnblogs.com/dingbj/p/10090583.html 

 

數組的概念就不多說了,大家都懂!

shell數組分為索引數組和關聯數組,今天只說普通的索引數組。

 

定義數組

像很多腳本語言一樣,shell變量不區分類型,對於普通數組,可申明也可以不申明:

如果習慣使用聲明,就使用declare 命令聲明

  例如:declare -a myarray

 

數組初始化在賦值語句的等號右側,緊挨着用一對括號表示數組,數組中元素之間使用“空格”分隔。

例如:

myarray=()  #定義一個空數組

myarray=(1 2 3 4 5)   #全部元素為數字

myarray=(one two three four five)  #全部元素為字符串

myarray=(1 two 3 three 4 five)  #元素由數值和字符串構成

myarray=(1 two 3 “a phrase” 5 now)

 

當然也可以直接為數組元素賦值來定義數組

例如:

myarray[0]=1

myarray[2]=test

myarray[3]="a phrase"

....

引用操作數組

  既然數組是一個變量,當然引用時也得使用$符開頭,但和普通標量變量不同,引用整個數組,需要使用${arr_name[*]}或${arr_name[@]}形式,否則使用$arr_name或者${arr_name}只會得到第一個元素。同樣,和標量變量一樣,數組變量也可以進行長度、分片、替換等操作,如下:

 

  用下標讀取某個元素的值

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

 

  用#獲取數組長度:${#數組名[@]} 或${#數組名[*]} 

  arr_len=${#arr_name[*]}或${#arr_name[@]}

 

       用#獲取某元素值的長度

  arr_elem_len=${#arr_name[index]}   #index為數組下標索引

 

  刪除數組

    刪除數組某個元素:unset arr_name[index]

    刪除整個數組:unset arr_number

 

  數組分片訪問

    分片訪問形式為:${數組名[@或*]:開始下標:偏移長度}

    例如:

        arr_name=(1 2 3 test go now)

           echo ${arr_name[@]:1:2},將輸出2 3

    ${arr_name[@]:1:2},這里分片訪問從下標1開始,元素個數為2。

 

  有用的數組擴展

    數組支持”+=“賦值運算符,利用這一點可以通過這種方式往一個已知數組中更方便的添加元素,特別是往空數組中填充元素時非常有用

    例如:

        

 

    實際應用舉例:

      為了充分利用多核處理器,對一組文件進行md5散列計算時,將每個文件的md5計算放到后台,

      利用空數組把每次調用md5sum命令產生的后台進程ID收集到空數組中,並等待所有后台md5sum進程結束后才退出主進程

      下面是gen_checksum.sh腳本的內容:

 

      #!/bin/bash

      #文件名:gen_checksum.sh

      PIDARRAY=()

      for file in file{1..10}iso ; do

         md5sum $file & 

         PIDARRAY+=($!)

      done

      wait ${PIDARRAY[@]}

 

     另一種方法擴展數組

      利用shell只有一維數組,在賦值時引用多個數組進行合並

     例如:

        格式:merge_array=( ${a[@] ${b[@]} ... )

        

 

  模式替換

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

    例如:echo ${arr_name[@]/now/past},將輸出1 2 3 test go past

 

  數組的遍歷

    通常我們使用for命令遍歷數組,遍歷數組時對數組引用通常需要加上雙引號,這樣才能正確遍歷含有空格字符串的元素

    例如:定義了數組arr_name=(1 2 3 test go now "a whole sentence"),遍歷時 輸出如下:

                         

 

     如果使用${arr_name[*]}格式引用數組進行遍歷,將得到一個數組元素以空格分隔的字符串

                        

   

   為什么遍歷數組時要加雙引號?

    無論使用@還是*的格式引用數組,不存在含空格的元素時,加不加引號對數組遍歷不會有什么問題,

  但一旦元素中含有空格,將不能得到預期效果,在實際使用時,元素的值通常時變量替換得到的,這不能保證

  是否含有空格,因此,為了穩妥起見,建議用引號括住數組變量,下面時不加引號的表現:

    例如:最后一個元素的值是a whole sentence字符串,包含有空格,但遍歷后以空格被拆分了,顯然這不是我們想要的結果

                        

                        

 


免責聲明!

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



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