-- 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
获取数组有效的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 --