bash数组

bash中的数组仅支持一维数组,数组定义好后数组的长度也可以动态地改变。

bash中的数组有两种,一种是常见的索引数组,另一种是bash4.0后支持的关联数组。

先简单谈一下关联数组:

declare -A array            #申明关联数组,如果要把array当做关联数组使用,这个必须申明

array[hello]=red;array[hi]=yellow;array[honey]=green.......

[baby@beibei ~]$ declare -A array
[baby@beibei ~]$ array[hello]=red
[baby@beibei ~]$ array[hi]=yellow
[baby@beibei ~]$ echo ${array[hello]}
red
[baby@beibei ~]$ echo ${array[hi]}
yellow

关联数组用的不多,下面介绍我们常用的


申明数组

declare -a array


数组的赋值

  1)一次对一个元素赋值:

       array[0]=red

       array[1]=yellow

       ......

   2)一次对所有元素进行赋值

      array=(red yellow green blue)

   3)按索引赋值

      array=([2]=green [1]=red [3]=yellow [0]=blue)

   4)命令替换

      logs=(`ls /var/log*.log`)或者logs=(/var/log/*.log)

      colors=(`cat color.text`) 直接从文件中读取,每一行为数组的一个元素

   5)用户输入

      read -a array

[baby@beibei tmp]$ read -a color
blue red black white
[baby@beibei tmp]$ echo ${color[@]}     #输出所有元素
blue red black white


数组的访问

array[index]    例:echo ${color[2]}


获取所有数组

    1)${array[@]}: 每个参数是一个独立的串

    2)${array[*]}: 所有参数是一个串

    下面是一个脚本的代码:

#!/bin/bash
declare -a color
color=(red blue yellow black white green)
for i in "${color[@]}"; do
 echo $i
done
for i in "${color[*]}"; do
 echo $i
done

   以下是执行结果:

[baby@beibei bashtest]$ ./arraytest.sh
red
blue
yellow
black
white
green
red blue yellow black white green

如此可以看出${array[@]}与${array[*]}的区别,一个是一整个字符串,一个是每个单独的元素是一个字符串。当然如果把这里的引号去掉"${color[*]}"。for循环也可以正确输出其中的每一个元素。


数组的长度

    1)${#ARRAY[*]}

    2)${#ARRAY[@]}

[baby@beibei tmp]$ array=(red yellow green blue)
[baby@beibei tmp]$ echo ${#array[*]}
4
[baby@beibei tmp]$ array=([2]=green [5]=yellow [0]=blue)
[baby@beibei tmp]$ echo ${#array[@]}
3                                        #没有定义的下标数组不会占用数组中元素的个数


从数组中挑选部分元素

${ARRAY[@]:offset:number}

  offset: 偏移的元素个数

  number: 取出的元素的个数 

[baby@beibei tmp]$ array=(red yellow green blue)
[baby@beibei tmp]$ echo ${array[@]:1:2}
yellow green

取出偏移量后的所有元素

${ARRAY[@]:offset}

[baby@beibei tmp]$ echo ${color[@]:1}
yellow green blue


连接两个数组

array=(${array1[@]} ${array2[@]})

[baby@beibei tmp]$ number=(3 5 1 9 7)
[baby@beibei tmp]$ color=(blue grey white red)
[baby@beibei tmp]$ array=(${number[@]} ${color[@]})
[baby@beibei tmp]$ echo ${array[@]}
3 5 1 9 7 blue grey white red


数组元素的删除与替换

array=(${array[@]/pattern1/string})

pattern可以是一个字符串,也可以是通配符,被匹配到的字符将被替换成string,若string不写,则匹配到的元素将被删除


元素删除:

[baby@beibei tmp]$ color=(blue1 blue2 red green)
[baby@beibei tmp]$ echo ${color[@]}
blue1 blue2 red green
[baby@beibei tmp]$ color=(${color[@]/blue*/})
[baby@beibei tmp]$ echo ${color[@]}
red green

元素替换:

[baby@beibei tmp]$ color=(blue1 blue2 red green)
[baby@beibei tmp]$ color=(${color[@]/blue*/white})
[baby@beibei tmp]$ echo ${color[@]}
white white red green

当然元素的删除也可以这样:

unset ARRAY[index]

[baby@beibei tmp]$ color=(blue1 blue2 red green)
[baby@beibei tmp]$ unset color[1]
[baby@beibei tmp]$ echo ${color[@]}
blue1 red green


遍历数组

#!/bin/bash
color=(red green yellow white black)
for i in ${color[@]}; do
 echo $i
done
exit 0
color=(red green yellow white black)
for((i=0;i<${#color[@]};i++)); do
 echo ${color[$i]}
done
exit 0

.......

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。