歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

bash shell之數組使用

這次寫腳本時用到了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個元素。

Copyright © Linux教程網 All Rights Reserved