bash指令碼中的普通陣列和關聯陣列

Amei1314發表於2016-04-22

1. 普通陣列

  bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。類似與C語言,陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。

  1.1 定義陣列

  在Shell中,用括號來表示陣列,陣列元素用“空格”符號分割開。定義陣列的一般形式為:
    array_name=(value1 ... valuen)

  

    array_name=(value0 value1 value2 value3)

    array_name=(
    value0
    value1
    value2
    value3
    )

  還可以單獨定義陣列的各個分量:

    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2

  可以不使用連續的下標,而且下標的範圍沒有限制。

  1.2 讀取陣列

讀取陣列元素值的一般格式是:
    ${array_name[index]}
例如:

  1. valuen=${array_name[2]}

舉個例子:

  

    #!/bin/sh
    NAME[0]="Zara"
    NAME[1]="Qadir"
    NAME[2]="Mahnaz"
    NAME[3]="Ayan"
    NAME[4]="Daisy"
    echo "First Method: ${NAME[*]}"
    echo "Second Method: ${NAME[@]}"
 

執行指令碼,輸出:

$./test.sh
First Index: Zara
Second Index: Qadir

使用@ 或 * 可以獲取陣列中的所有元素,例如:

  

    ${array_name[*]}
    ${array_name[@]}

 

  舉個例子:

  

    #!/bin/sh
    NAME[0]="Zara"
    NAME[1]="Qadir"
    NAME[2]="Mahnaz"
    NAME[3]="Ayan"
    NAME[4]="Daisy"
    echo "First Method: ${NAME[*]}"
    echo "Second Method: ${NAME[@]}"

  執行指令碼,輸出:

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

  1.3獲取陣列的長度

獲取陣列長度的方法與獲取字串長度的方法相同,例如:
    # 取得陣列元素的個數
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得陣列單個元素的長度
    lengthn=${#array_name[n]}

2. 關聯陣列

  shell 提供了另外一種陣列,其可以使用任意的字串作為下標(不必是整數)來訪問陣列元素。這種陣列叫做關聯陣列(associative array)。
關聯陣列的下標和值稱為鍵值對,它們是一一對應的關係。在關聯陣列中,鍵是唯一的,值可以不唯一。
shell 的關聯陣列和 perl 的關聯陣列在實現功能上是一樣的。在 perl 中,關聯陣列有時候稱為雜湊(hash)。

  2.1 定義關聯陣列
shell 的關聯陣列和 shell 的下標陣列在定義和使用上完全一樣,只是在索引上有區別。
需要注意的是,在使用關聯陣列之前,需要使用命令 declare -A array 進行顯示宣告。

  

#!/bin/bash
name=(jim tom lucy)

declare -A phone
phone=([jim]=135 [tom]=136 [lucy]=158)

for i in `eval echo {0..$((${#name[*]}-1))}`
do
    echo ${name[i]} phone number is ${phone["${name[i]}"]}
done

  在命令提示符下輸入 ./test.sh,執行結果如下:
  jim phone number is 135
  tom phone number is 136
  lucy phone number is 158

  2.2 關聯陣列的讀取和求長度和普通的陣列方法一樣

複製執行指令碼,輸出:

相關文章