本文為原創博文,轉發請注明原創鏈接:https://www.cnblogs.com/dingbj/p/10090583.html
數組的概念就不多說了,大家都懂!
shell數組分為索引數組和關聯數組,今天只說普通的索引數組。
定義數組
像很多腳本語言一樣,shell變量不區分類型,對於普通數組,可申明也可以不申明:
如果習慣使用聲明,就使用declare 命令聲明
例如:declare -a myarray
數組初始化:在賦值語句的等號右側,緊挨着用一對括號表示數組,數組中元素之間使用“空格”分隔。
例如:
myarray=() #定義一個空數組
myarray=(1 2 3 4 5) #全部元素為數字
myarray=(one two three four five) #全部元素為字符串
myarray=(1 two 3 three 4 five) #元素由數值和字符串構成
myarray=(1 two 3 “a phrase” 5 now)
當然也可以直接為數組元素賦值來定義數組
例如:
myarray[0]=1
myarray[2]=test
myarray[3]="a phrase"
....
引用操作數組
既然數組是一個變量,當然引用時也得使用$符開頭,但和普通標量變量不同,引用整個數組,需要使用${arr_name[*]}或${arr_name[@]}形式,否則使用$arr_name或者${arr_name}只會得到第一個元素。同樣,和標量變量一樣,數組變量也可以進行長度、分片、替換等操作,如下:
用下標讀取某個元素的值
arr_element2=${arr_name[2]},即形式:${數組名[下標]}
用#獲取數組長度:${#數組名[@]} 或${#數組名[*]}
arr_len=${#arr_name[*]}或${#arr_name[@]}
用#獲取某元素值的長度
arr_elem_len=${#arr_name[index]} #index為數組下標索引
刪除數組
刪除數組某個元素:unset arr_name[index]
刪除整個數組:unset arr_number
數組分片訪問
分片訪問形式為:${數組名[@或*]:開始下標:偏移長度}
例如:
arr_name=(1 2 3 test go now)
echo ${arr_name[@]:1:2},將輸出2 3
${arr_name[@]:1:2},這里分片訪問從下標1開始,元素個數為2。
有用的數組擴展
數組支持”+=“賦值運算符,利用這一點可以通過這種方式往一個已知數組中更方便的添加元素,特別是往空數組中填充元素時非常有用
例如:
實際應用舉例:
為了充分利用多核處理器,對一組文件進行md5散列計算時,將每個文件的md5計算放到后台,
利用空數組把每次調用md5sum命令產生的后台進程ID收集到空數組中,並等待所有后台md5sum進程結束后才退出主進程
下面是gen_checksum.sh腳本的內容:
#!/bin/bash
#文件名:gen_checksum.sh
PIDARRAY=()
for file in file{1..10}iso ; do
md5sum $file &
PIDARRAY+=($!)
done
wait ${PIDARRAY[@]}
另一種方法擴展數組
利用shell只有一維數組,在賦值時引用多個數組進行合並
例如:
格式:merge_array=( ${a[@] ${b[@]} ... )
模式替換
格式為:${數組名[@或*]/模式/新值}
例如:echo ${arr_name[@]/now/past},將輸出1 2 3 test go past
數組的遍歷
通常我們使用for命令遍歷數組,遍歷數組時對數組引用通常需要加上雙引號,這樣才能正確遍歷含有空格字符串的元素
例如:定義了數組arr_name=(1 2 3 test go now "a whole sentence"),遍歷時 輸出如下:
如果使用${arr_name[*]}格式引用數組進行遍歷,將得到一個數組元素以空格分隔的字符串
為什么遍歷數組時要加雙引號?
無論使用@還是*的格式引用數組,不存在含空格的元素時,加不加引號對數組遍歷不會有什么問題,
但一旦元素中含有空格,將不能得到預期效果,在實際使用時,元素的值通常時變量替換得到的,這不能保證
是否含有空格,因此,為了穩妥起見,建議用引號括住數組變量,下面時不加引號的表現:
例如:最后一個元素的值是a whole sentence字符串,包含有空格,但遍歷后以空格被拆分了,顯然這不是我們想要的結果