bash shell之数组使用(牛逼篇)

转载 http://www.linuxidc.com/Linux/2012-08/67655.htm


这次写脚本时用到了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个元素。


你可能感兴趣的:(shell,数组,多维)