這次寫腳本時用到了bash shell數組,當初做法是配置文件裡面寫成數組形式A=(element1 element2 element3 .... element4),然後一個腳本讀取這個配置文件,於是稍微總結了一下數組的使用方法:
Bash shell中使用數組變量 , 其賦值/定義有兩種 :
1. name=(value1 ... valuen) 此時下標從0開始,也可以這樣做:name=([1]=a [2]=b [0]=c)
2. name[index] =value
3. declare -a arrayname=(element1 element2 element3)
4. declare -a Unix=('Debian' 'Red Hat' 'Red hat' 'SUSE' 'Fedora') # 如果單個元素包括括號
操作方式:
1. 數組長度:${#arrary[@]}
2. 遍歷數組:for i in ${array[@]} ; do ; echo $i 或者如下:
先得到這個數組的有效索引:${!array[@]},然後利用 array[$index]來操作。例如:A={[1]=2 [3]=4 [4]=5}
for idx in ${!A[@]} ; do echo ${idx}_${A[$idx]} ; done
需要注意的是 ${A[*]}與${A[@]}的區別:
當兩者都沒有用""括起來的時候也就是${A[@]} ${A[*]}的效果是一樣的,但是有了""
"${A[@]}" :最大限度的保持原意,比如A[1]='a b' 那麼這樣輸出的也是a b這是一個整體,而如果沒有"",這輸出的是a b這是兩個元素!
"${A[*]}":所有的元素都變成一個字符串了,也就是一個整體 【Linux公社 http://www.linuxidc.com 】
3. 取某一個元素:array[index],如果單個元素裡面包含多個空格,那麼保留這多個空格需要"",比如echo "${array[2]}"
4. 使一個字符串變bash shell 數組,可以放在文件裡面,然後source file,但是這個file裡面的內容的是:array=(value1 value2 ... valuen)這種形式,還有一種最簡單的做法:array=(`cat filename`)(此時filename裡面就不是array=這種形式了,而是直接value1 value2 value3...) 或者array=(content)
5. 清除一個數組,清0, unset arrayname
6. 連接兩個數組,array=("${array1[@]}" "${array2[@]}"),用""的目的是防止元素本身包含空格,前面已經提到過
7. 復制一個數組,跟上面連接一樣array=("${array1[@]}")
8. 數組添加元素,原理也跟上面一樣array=("${array1[@]}" "xx")
9. 提取數組的元素,${array[@]:3:2} 從第三個位置開始,取兩個元素。如果是針對一個元素提取(相當於substring)${array[index]:start:len}
貌似bash shell中沒有多維數組,那麼該怎麼實現呢?我自己想了一個比較笨的方法,這個方法也得對數據的組織形式有要去:
普通的我們一維數組是這樣的:
a=(1 2 3 4 5 6)
假設需要一個二維數組:
b=(1 2 3,
4 5 6,
7 8 9)
當然這種寫法是不對的,只是便於理解而已。此時我們可以再構造二維數組之前寫一個這樣的二維數組:
a=('1 2 3' '4 5 6' '7 8 9')
然後我們可以利用
for i in "${a[@]}" ; do
echo $i #這一步就得到了每一行,而如果我們需要二維數組,那麼可以這樣做
done
for i in "${a[@]}" ; do
b=($i) #此時b就相當於二維數組裡面的一維數組了,然後可以再次遍歷
for j in "${b[@]}"; do
#do someting
done
done
其實我們有時候完全可以這樣做:構造成這樣:a=(1 2 3 4 5 6 7 8 9),然後操作的時候利用第i行j列的元素等於i*len+j,len是數組的第二維度大小,這樣做有時候更簡單,但是就必須得控制一下邊界了,比如3*3的數組,你可能初始化只給出8個元素。