簡(jiǎn)單高效的Shell數(shù)組操作技巧與技術(shù)

Shell Array
數(shù)組是Shell腳本中一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組數(shù)據(jù)。在Shell中,我們可以使用各種技巧來(lái)操作數(shù)組,包括數(shù)組的取值、移除數(shù)組中匹配的字符以及判斷一個(gè)值是否在數(shù)組中。下面是一些常用的Shell數(shù)組操作技巧。
數(shù)組的初始化
使用空格分隔的元素初始化數(shù)組:
#?創(chuàng)建一個(gè)名為arrayZ的數(shù)組,其中包含了6個(gè)元素。
arrayZ=(?one?two?three?four?five?five?)
使用冒號(hào)分隔的元素,并使用字符串替換進(jìn)行數(shù)組初始化:
str="a:b:c:d:e"
set?-f?#?避免通配符擴(kuò)展(*的擴(kuò)展)
arr=(${str//:/?})?
#?現(xiàn)在數(shù)組arr包含了值?'a',?'b',?'c',?'d',?'e'
使用'tr'命令將冒號(hào)替換為換行符進(jìn)行數(shù)組初始化
str="a:b:c:d:e"
arr=($(echo?$str?|?tr?':'?"\n"))
#?現(xiàn)在數(shù)組arr包含了值?'a',?'b',?'c',?'d',?'e'
使用'sed'命令將冒號(hào)替換為換行符進(jìn)行數(shù)組初始化:
str="a:b:c:d:e"
arr=($(echo?$str?|?sed?'s/:/\n/g'))
#?現(xiàn)在數(shù)組arr包含了值?'a',?'b',?'c',?'d',?'e'
使用'IFS'(內(nèi)部字段分隔符)和'eval'命令進(jìn)行數(shù)組初始化:
str="a:b:c:d:e"
IFS=':'?eval?'arr=($str)'
#?現(xiàn)在數(shù)組arr包含了值?'a',?'b',?'c',?'d',?'e'
數(shù)組的訪問(wèn)
比如有如下一個(gè)數(shù)組: arrayZ=(one two three four five five)
使用${array[@]}或${array[*]}可以獲取數(shù)組中的所有元素。
#?獲取所有元素
echo?${arrayZ[@]}???#?輸出:?one?two?three?four?five?five
echo?${arrayZ[*]}???#?輸出:?one?two?three?four?five?five
使用${array[@]:1}可以獲取數(shù)組中從第二個(gè)元素開(kāi)始的所有元素。
echo?${arrayZ[@]:1}?//two?three?four?five?
使用${array[@]:2:3}可以獲取數(shù)組中從第三個(gè)元素開(kāi)始的三個(gè)元素。
#?獲取從第三個(gè)元素開(kāi)始的三個(gè)元素
echo?${arrayZ[@]:2:3}???#?輸出:?three?four?five
使用${#array[*]}或${#array[@]}可以獲取數(shù)組中元素的個(gè)數(shù)。
#?獲取數(shù)組中元素的個(gè)數(shù)
echo?${#arrayZ[*]}???#?輸出:?6
echo?${#arrayZ[@]}???#?輸出:?6
使用${#array[0]}可以獲取數(shù)組中第一個(gè)元素的長(zhǎng)度。
#?獲取第一個(gè)元素的長(zhǎng)度
echo?${#arrayZ[0]}???#?輸出:?3
數(shù)組的操作
使用#和##、%和%%操作符來(lái)移除數(shù)組中匹配的字符
#?最短匹配和最長(zhǎng)匹配
echo?${arrayZ[@]#f*r}??#?移除匹配"four"
echo?${arrayZ[@]##t*e}?#?最長(zhǎng)匹配,移除匹配"three"
echo?${arrayZ[@]%h*e}??#?移除匹配"four"
echo?${arrayZ[@]%%t*e}?#?最長(zhǎng)匹配,移除匹配"three"
判斷一個(gè)值是否在數(shù)組中
使用 grep 命令
arrayZ=(?one?two?three?four?five?five?)
#?判斷值是否在數(shù)組中
echo?${arrayZ[@]:0}?|?grep?-o?'\bone\b'?>?/dev/null
if?[?$??-eq?0?];?then
????echo?"值在數(shù)組中"
else
????echo?"值不在數(shù)組中"
fi
上面的示例中,${arrayZ[@]:0} 用于將數(shù)組展開(kāi)為一個(gè)字符串,然后使用 grep 命令匹配值,并通過(guò) -o 參數(shù)只輸出匹配到的值。如果值在數(shù)組中,grep 命令會(huì)返回 0,否則返回非零值。通過(guò)判斷 $? 的值,可以確定值是否在數(shù)組中。
使用自定義函數(shù)
containsElement?()?{
????local?e
????for?e?in?"${@:2}";?do
????????[[?"$e"?==?"$1"?]]?&&?return?0
????done
????return?1
}
#?判斷值是否在數(shù)組中
arrayZ=(?one?two?three?four?five?five?)
containsElement?"onxxx"?"${arrayZ[@]}"
if?[?$??-eq?0?];?then
????echo?"值在數(shù)組中"
else
????echo?"值不在數(shù)組中"
fi
上面的示例中,containsElement 函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是要判斷的值,第二個(gè)參數(shù)是數(shù)組。函數(shù)通過(guò)遍歷數(shù)組中的每個(gè)元素,比較是否與要判斷的值相等,如果相等則返回 0,表示值在數(shù)組中;否則返回非零值,表示值不在數(shù)組中。