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[*]}":所有的元素都变成一个字符串了,也就是一个整体 


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个元素。