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]}
示例:
#!/bin/bash #數組取值 days=(one two three four) echo ${days} echo ${days[0]} echo ${days[1]} echo ${days[@]} echo ${days[*]} echo "**********" names=() names[1]=tom names[2]=jack echo ${names} echo ${names[1]} echo ${names[@]}
結果:
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[@]})
Shell數組操作