1. 程式人生 > >shell中陣列的使用

shell中陣列的使用

1、陣列定義

1.1 declare定義

使用declare -a 命令定義陣列(陣列的索引是從0開始計數的),接下來就可以通過[]操作符為不同索引位置的元素賦值。

declare -a names
names[0]=tom
names[1]=jack

注意:shell變數是弱型別的,不要求陣列中元素型別相同

在定義陣列的同時,可以同時賦值,用()表示,各元素之間用空格隔開

#定義的同時直接賦值
declare -a names=(tom jack)
#增加元素
names[2]=sue

1.2直接定義

建立陣列最簡單的方法是使用()直接定義陣列,括號中元素用空格隔開;在括號中也可以宣告下標。例項:

#使用()直接陣列
days1=(one two three four five)
#或者在()中宣告下標,預設從0開始
days2=([0]=’one’ [1]=’two’ [2]=’three’ [3]=’four’)
#下標可以不連續
days3=([0]=’one’ [2]=’three’)

1.3帶下標定義

使用[]操作符,為每一個指定下標賦值,下標也可以不連續

header[0]=’user’
header[1]=’pid’
header[2]=’%CPU’
header[3]=’%MEM’

1.4從檔案讀取陣列

days=(`cat days.txt`)

2、陣列操作

2.1賦值

指定下標,使用[]操作符為元素賦值,當下標不存在時,相當於為陣列增加元素

declare -a names
names[0]=tom

2.2取值

指定下標,使用[]操作符從陣列中對應元素,然後使用

取值,格式: {陣列名[索引]}

days=(one two three four five)
#取出第1個元素
echo ${days[0]}
#取出第3個元素
echo ${days[2]}
獲得陣列中所有值:${陣列名[@]}、${陣列名[*]}

${陣列名[@]}得到是以空格隔開的元素,可以用在陣列遍歷中;${陣列名[*]}得到的是一整個字串。

注意:${陣列名}並不會獲得所有值,它只會獲得到第一個元素的值。即 {陣列名}等價於 {陣列名[0]}

2.3長度

利用”@”或“*”字元,將陣列擴充套件成列表,然後使用”#”來獲取陣列元素的個數。

示例:

#!/bin/bash
#陣列個數

days=(one two three four)
echo "陣列days的元素個數為:${#days[@]}"

echo "**********"
names=()
names[1]=tom
names[2]=jack
echo "陣列names的元素個數為:${#names[*]}"

結果:
在這裡插入圖片描述

注意:如果某個元素是字串,可以通過制定索引的方式獲得該元素的長度。

2.4遍歷

存在以下三種方式:

(1)${陣列名[@]}、${陣列名[@]}均可以獲得所有元素(不管是元素列表,還是一整個字串),使用for迴圈遍歷即可

(2)帶陣列下標的遍歷,當需要使用到陣列的下標時,可以使用${!陣列名[@]}

(3)while迴圈:根據元素的個數遍歷,但對於稀疏陣列,可能會丟失資料

示例:

#!/bin/bash
#陣列遍歷

days=(one two three four)
#for迴圈遍歷
for day in ${days[*]}  #或${days[@]}
do
        echo $day
done
echo "***************"
#fou迴圈帶下標遍歷
for i in ${!days[@]}
do
        echo ${days[$i]}
done

echo "***************"
#while迴圈
names=()   #陣列names是一個稀疏陣列
names[1]=tom
names[2]=jack
i=0
while [ $i -lt ${#names[*]} ]
do
        echo ${names[$i]}
        let i++
done

結果:
在這裡插入圖片描述

2.5刪除

刪除一個數組或陣列中元素用unset命令。

unset 陣列名[索引] #刪除索引下的元素

unset 陣列名 #刪除整個陣列

2.6連線

用()將多個數組連線在一起,()中各個陣列用空格隔開。

days=(one two three four)
names=(tom jack)
days=(${days[@]} ${names[@]})

2.7分片

days=(one two three four)
echo ${days[@]:1:2}
使用@將陣列轉換成列表後再進行分片,分片結果包含起始下標與結束下標的元素