Shell(2)—數組

Shell(2)—數組

經常使用的 Bash Shell 只支持一維數組,不支持多維數組。html

1、概念

Shell 而且沒有限制數組的大小,理論上能夠存放無限量的數據。Shell 數組元素的下標也是從 0 開始計數。shell

一、Shell 數組的定義

在 Shell 中,用括號( )來表示數組,數組元素之間用空格來分隔。由此,定義數組的通常形式爲:數組

array_name=(ele1  ele2  ele3 ... elen)

注意,賦值號=兩邊不能有空格,必須緊挨着數組名和數組元素。bash

下面是一個定義數組的實例:.net

nums=(3 13 23 33 43 53)

Shell 是弱類型的,它並不要求全部數組元素的類型必須相同,例如:code

arr=(3 30 "小小")

第三個元素就是一個「異類」,前面兩個元素都是整數,而第三個元素是字符串。htm

Shell 數組的長度不是固定的,定義以後還能夠增長元素。例如,對於上面的 nums 數組,它的長度是 6,使用下面的代碼會在最後增長一個元素,使其長度擴展到 7:blog

nums[6]=88

此外,你也無需逐個元素地給數組賦值,下面的代碼就是隻給特定元素賦值:字符串

ages=([3]=24 [5]=19 [10]=12)

以上代碼就只給第 三、五、10 個元素賦值,因此數組長度是 3。其它位置都是取不到值的。get

二、獲取數組元素

獲取數組元素的值,通常使用下面的格式:

${array_name[index]} #其中,array_name 是數組名,index 是下標

例如:

n=${nums[2]} #表示獲取 nums 數組的第二個元素,而後賦值給變量 n。

例如:

echo ${nums[3]}  #直接輸出 nums 數組的第 3 個元素

使用@*能夠獲取數組中的全部元素

${nums[*]}
${nums[@]}  #二者均可以獲得 nums 數組的全部元素。

示例,建立array.sh

#!/bin/bash
nums=(3 28 30 62 65)
echo ${nums[@]}  #輸出全部數組元素
nums[10]=100     #給第10個元素賦值(此時會增長數組長度)
echo ${nums[*]}  #輸出全部數組元素
echo ${nums[4]}  #輸出第4個元素
echo ${nums[10]} #輸出第10個元素

運行腳本 bash array.sh

3 28 30 62 65
3 28 30 62 65 100
65
100

三、Shell獲取數組長度

利用@*,能夠將數組擴展成列表,而後使用#來獲取數組元素的個數,格式以下:

${#array_name[@]}
${#array_name[*]}  # 其中 array_name 表示數組名。兩種形式是等價的,選擇其一便可。

示例,建立array1.sh

#!/bin/bash

nums=(3 28 30)
echo ${#nums[*]}
#向數組中添加元素
nums[6]="爺爺64歲"
echo ${#nums[@]}
#刪除數組元素
unset nums[1]
echo ${#nums[*]}

運行腳本

3
4
3

四、Shell數組合並

思路:先利用@*,將數組擴展成列表,而後再合併到一塊兒。

array_new=(${array1[@]}  ${array2[@]}) #兩種方式是等價的,選擇其一便可。
array_new=(${array1[*]}  ${array2[*]}) #array1 和 array2 是須要拼接的數組

示例 建立array2.sh

#!/bin/bash

array1=(3 28)
array2=(30 "小小3歲,媽媽28,爸爸30")
array_new=(${array1[@]} ${array2[*]}) #合併數組
echo ${array_new[@]}  #也能夠寫做 ${array_new[*]}

運行腳本 bash array2.sh

3 28 30 小小3歲,媽媽28,爸爸30

五、Shell刪除數組元素

unset 使用 unset 關鍵字來刪除數組元素。

unset array_name[index] #array_name 表示數組名,index 表示數組下標
unset array_name        #若是不寫下標那麼就是刪除整個數組,全部元素都會消失。

示例 建立array3.sh

#!/bin/bash
arr=(0 1 2 3)
unset arr[1]
echo ${arr[@]}
unset arr
echo ${arr[*]}

運行腳本

0 2 3
         #這裏空行,它表示什麼也沒輸出,由於數組被刪除了,因此輸出爲空


2、Shell關聯數組

理解:咱們正常的數組都是經過下標0~N來獲取指定元素。而Shell關聯數組(下標是字符串的數組)。

關聯數組 也稱爲「鍵值對(key-value)」數組,鍵(key)也即字符串形式的數組下標,值(value)也即元素值。

注意 關聯數組是在bash4.0之後版本纔有,因此先看下本身bash版本:bash —version,若是不是就要升級

​ 相關博客:Mac升級bash到最新版本

一、關聯數組建立

例如,咱們能夠建立一個叫作 color 的關聯數組,並用顏色名字做爲下標。

declare -A color
color["red"]="#ff0000"
color["green"]="#00ff00"
color["blue"]="#0000ff"

也能夠在定義的同時賦值:

declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")

不一樣於普通數組,關聯數組必須使用帶有-A選項的 declare 命令建立。

二、訪問關聯數組元素

訪問關聯數組元素的方式幾乎與普通數組相同,具體形式爲:

array_name["index"]

例如:

color["white"]="#ffffff"
color["black"]="#000000"

加上$()便可獲取數組元素的值:

$(array_name["index"])

例如:

echo $(color["white"])
white=$(color["black"])

三、獲取全部元素的下標和值

使用下面的形式能夠得到關聯數組的全部元素值:

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

使用下面的形式能夠獲取關聯數組的全部下標值:

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

四、獲取關聯數組長度

使用下面的形式能夠得到關聯數組的長度:

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

示例 建立array5.sh

#!/bin/bash

declare -A color
color["red"]="#ff0000"
color["green"]="#00ff00"
color["blue"]="#0000ff"
#獲取全部元素值
for value in ${color[*]}
do
    echo $value
done
echo "****************"
#獲取全部元素下標(鍵)
for key in ${!color[*]}
do
    echo $key
done
echo "****************"
#列出全部鍵值對
for key in ${!color[@]}
do
    echo "${key} -> ${color[$key]}"
done

運行結果(說明 這裏並無親測,由於個人bash是3.2.7版本,暫不支持關聯數組,後期升級bash)

#ff0000
#0000ff
#ffffff
****************
red
blue
white
****************
red -> #ff0000
blue -> #0000ff
white -> #ffffff


參考

Shell數組精講




只要本身變優秀了,其餘的事情纔會跟着好起來(少將16)
相關文章
相關標籤/搜索