bash shell 数组用法

教程 2108浏览 0评论

 赋值

Bash shell中使用数组变量 , 其赋值/定义有下面几种 :bash

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 数组

有以下几种方法:

1) 可以放在里面,然后 source file,但是这个file里面的内容的是:array=(value1 value2 ... valuen)这种形式

2) 还有一种最简单的做法:array=(`cat filename`)(此时filename里面就不是array=这种形式了,而是直接value1 value2 value3...)

3) 或者array=(content)

5. 清除一个数组

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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址