Bash中的数组

-- TOC --

bash支持数组,作为一种raw interpret的基本上就是字符串处理的编程语言,还是很厉害的。

定义数组,访问单个元素

$ aa=(a b c)  # define array
$ echo $aa[0] $aa[1] $aa[2]  # wrong
a[0] a[1] a[2]
$ echo ${aa[0]} ${aa[1]} ${aa[2]}  # right, must be curly braced
a b c

另一种定义数组的方式:

$ bb[0]=0
$ bb[1]=1
$ bb[2]=2
$ echo ${bb[0]} ${bb[1]} ${bb[2]}
0 1 2

bash数组不一定有连续的index,没有定义的index,在访问时,与没有定义的变量一样:

$ cc[1]=c1
$ cc[3]=c3
$ echo ${cc[0]} ${cc[1]} ${cc[2]} ${cc[3]}
c1 c3

怪异的数组定义:

$ dd=([2]=3 [0]=0)
$ echo ${dd[0]} ${dd[2]}
0 3
$ ee=(1 [5]=5 6)
$ echo ${ee[0]} ${ee[5]} ${ee[6]}
1 5 6

读取数组所有元素

$ echo ${aa[@]}
a b c
$ echo ${aa[*]}
a b c
$ for i in ${aa[@]}; do echo $i; done
a
b
c
$ for i in ${aa[*]}; do echo $i; done
a
b
c
$ for i in "${aa[@]}"; do echo $i; done
a
b
c
$ for i in "${aa[*]}"; do echo $i; done
a b c

是否放入""内,是有差异的...

$ gg=(aa "bb cc dd" ee)
$ for i in ${gg[@]}; do echo $i; done
aa
bb
cc
dd
ee
$ for i in "${gg[@]}"; do echo $i; done
aa
bb cc dd
ee
$ for i in ${gg[*]}; do echo $i; done
aa
bb
cc
dd
ee
$ for i in "${gg[*]}"; do echo $i; done
aa bb cc dd ee

数组长度

$ echo ${#aa[@]}
3
$ echo ${#aa[*]}
3
$ echo ${#gg[@]}
3
$ echo ${#gg[*]}
3

数组首位置

当访问数组而不提供index的时候,默认是访问数组的首位置。

$ echo ${aa} ${aa[0]}
a a
$ echo ${gg} ${gg[0]}
aa aa

两个内置的bash数组

获取数组有效的index

$ ee=(1 [5]=5 6)
$ echo ${!ee[@]}
0 5 6
$ echo ${!ee[*]}
0 5 6

追加和删除数组成员

$ echo ${aa[@]}
a b c
$ aa+=(d e f)
$ echo ${aa[@]}
a b c d e f
$ unset aa[1] aa[4]
$ echo ${aa[@]}
a c d f
$ echo ${!aa[@]}
0 2 3 5

删除数组成员后,原来的index不变。

让用户输入一个数组

使用read命令的-a参数:

$ read -p 'input an array: ' -a yy
input an array: 1 2 3 4 5
$ echo ${yy[@]}
1 2 3 4 5

用declare申明一个数组,也是使用-a参数:declare -a array_name

用string作为key的数组

这就有点像一个mapping数据结构了,首先要使用declear -A做个申明:

$ declare -A jj
$ jj['aa']=11
$ jj['bb']=22
$ jj['cc']=33
$ echo ${jj[@]}
22 11 33
$ echo ${!jj[@]}
bb aa cc
$ for i in ${jj[@]}; do echo $i; done
22
11
33

这种mapping结构,遍历的时候,不一定会按照输入顺序返回数据。

本文链接:https://cs.pynote.net/sf/linux/shell/202201261/

-- EOF --

-- MORE --