您的位置:首页 > 运维架构 > Shell

shell 二维数组

2015-09-09 15:02 423 查看
这次写脚本时用到了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个元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: