天天看點

[Shell]數組與關聯數組

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/51526312

1.數組

1.1. 數組定義

一對圓括号表示數組,數組元素之間用空格符号分割

  1. xiaosi@Qunar:~$ a=(1 2 3)

  2. xiaosi@Qunar:~$ echo $a

  3. 1

  4. xiaosi@Qunar:~$ a=("yoona" "lucy" "tom")

  5. xiaosi@Qunar:~$ echo $a

  6. yoona

1.2. 數組長度,元素,指派與删除

長度:用${#數組名[@或*]} 可以得到數組長度

  1. xiaosi@Qunar:~$ echo ${#a[@]}

  2. 3

  3. xiaosi@Qunar:~$ echo ${#a[*]}

  4. 3

擷取元素:用${數組名[下标]} 得到數組元素(下标從0開始), 下标為*或者@得到整個數組内容

  1. xiaosi@Qunar:~$ array=("yoona" "lucy" "tom")

  2. xiaosi@Qunar:~$ echo ${array[0]}

  3. yoona

  4. xiaosi@Qunar:~$ echo ${array[1]}

  5. lucy

  6. xiaosi@Qunar:~$ echo ${array[*]}

  7. yoona lucy tom

  8. xiaosi@Qunar:~$ echo ${array[@]}

  9. yoona lucy tom

指派:通過數組名[下标]可以對其進行引用指派,如果下标不存在,自動添加新一個數組元素

  1. xiaosi@Qunar:~$ array=("yoona" "lucy" "tom")

  2. xiaosi@Qunar:~$ echo ${array[2]}

  3. tom

  4. xiaosi@Qunar:~$ array[2]=lily

  5. xiaosi@Qunar:~$ echo ${array[2]}

  6. lily

删除:通過unset數組[下标]可以清除相應的元素,不帶下标則清除全部資料

  1. xiaosi@Qunar:~$ array=("yoona" "lucy" "tom")

  2. xiaosi@Qunar:~$ unset array[1]

  3. xiaosi@Qunar:~$ echo ${array[*]}

  4. yoona tom

  5. xiaosi@Qunar:~$ unset array

  6. xiaosi@Qunar:~$ echo ${array[*]}

  7. xiaosi@Qunar:~$

1.3. 擷取某範圍的元素

直接通過 ${數組名[@或*]:起始位置:長度} 擷取數組給定範圍内元素,傳回字元串,中間用空格分開

  1. xiaosi@Qunar:~$ array=(yoona lucy tom)

  2. xiaosi@Qunar:~$ echo ${array[*]}

  3. yoona lucy tom

  4. xiaosi@Qunar:~$ echo ${array[*]:1:2}

  5. lucy tom

  6. xiaosi@Qunar:~$ echo ${array[@]:0:1}

  7. yoona

1.4. 替換

${數組名[@或*]/查找字元/替換字元} 該操作不會改變原先數組内容,如果需要修改,可以看上面例子

  1. xiaosi@Qunar:~$ array=(yoona lucy tom)

  2. xiaosi@Qunar:~$ echo ${array[@]/lucy/lily}

  3. yoona lily tom

  4. xiaosi@Qunar:~$ echo ${array[@]}

  5. yoona lucy tom

2. 關聯數組

Bash支援關聯數組,它可以使用字元串作為數組索引,有時候采用字元串索引更容易了解。

2.1 定義關聯數組

首先需要使用聲明語句将一個變量聲明為關聯數組。

  1. xiaosi@Qunar:~$ declare -A assArray

聲明之後,可以有兩種方法将元素添加到關聯數組中。

(1)利用内嵌索引-值清單的方法

  1. xiaosi@Qunar:~$ assArray=([lucy]=beijing [yoona]=shanghai)

  2. xiaosi@Qunar:~$ echo ${assArray[lucy]}

  3. beijing

(2)使用獨立的索引-值進行指派

  1. xiaosi@Qunar:~$ assArray[lily]=shandong

  2. xiaosi@Qunar:~$ assArray[sunny]=xian

  3. xiaosi@Qunar:~$ echo ${assArray[sunny]}

  4. xian

  5. xiaosi@Qunar:~$ echo ${assArray[lily]}

  6. shandong

2.2 列出數組索引

每一個數組都有一個索引用于查找。使用${!數組名[@或者*]}擷取數組的索引清單

  1. xiaosi@Qunar:~$ echo ${!assArray[*]}

  2. lily yoona sunny lucy

  3. xiaosi@Qunar:~$ echo ${!assArray[@]}

  4. lily yoona sunny lucy

2.3 擷取所有鍵值對
  1. #! /bin/bash

  2. declare -A cityArray

  3. cityArray=([yoona]=beijing [lucy]=shanghai [lily]=shandong)

  4. for key in ${!cityArray[*]}

  5. do

  6. echo "${key} come from ${cityArray[$key]}"

  7. done

結果:

  1. xiaosi@Qunar:~/company/sh$ bash array.sh

  2. lily come from shandong

  3. yoona come from beijing

  4. lucy come from shanghai