bash提供一维数组,在数组元素的最大数目上并无约束,甚至,不要求数组元素被连续赋值,其下标从0开始。


创建与赋值

一个数组可以通过如下方式复制而自动创建

name[subscript]=value

其中下标subscript必须为整数,大于或等于0。

也可以显式的声明如下:

declare -a name 
# 或者 
declare -a name[subscript] 
# shell解释时会忽略subscript

用如下方式可对整个数组赋值

name=(var1 var2 … varn)

也可以在赋值创建时候就指定对哪个元素赋值

name=([0]=1 [2]=34 [3]=45)

这样,在赋值的时候跳过对下标1的赋值,则变为空

$ echo ${name[0]} 

$ echo ${name[1]} 
 
$ echo ${name[2]} 
34

数组元素可以是字符串,元素间以环境变量IFS分隔

$ name=(hello glad to see you) 
$ echo ${name[0]} 
hello

若要跨过分隔约束,可以用引号括起,单引号双引号都可以

$ name=(hello “glad to” see you) 
$ echo ${name[1]} 
glad to

数组引用

在引用数组变量时,用 ${name[subscript]},必须要加上{ },否则shell无法解释。

若下标为@*,则作为通配符解释,代指所有的数组元素,但不可对这个两个作为下标赋值。

$ echo ${name[@]}
 1 34 45 
$ echo ${name[*]} 
1 34 45 
$ name[*]=23 
-bash: name[*]: bad array subscript

数组元素个数以${#name[@]}或者${#name[*]}获得。

$ name=(1 2 3 4) 
$ echo ${#name[@]} 

$ echo ${#name[*]} 
4

无下标的数组引用等价于引用其第0个元素

$ name=(2 3 4) 
$ echo ${name} 
2

销毁

unset命令可以销毁一个数组,也可以销毁一个元素

# 销毁整个数组 
unset name 
unset name[*] 
# 销毁一个元素 
unset name[subscript]

扩展-漂移

获取数组某个元素的长度,比如下面例子,world长度为5

$ name=(hello world) 
$ echo ${name[1]} 
world 
$ echo ${#name[1]} 
5

数组元素漂移位置

$ echo ${name[1]:0} # 漂移量为0 
world 
$ echo ${name[1]:1} # 漂移量为1 
orld 
$ echo ${name[1]:3} # 漂移量为3 
ld 
$ echo ${name[1]:6} # 超过元素长度,显示空行

数组整体漂移位置

$ array=(one two three four five) 
$ echo ${array[@]:0} 
one two three four five 
$ echo ${array[@]:1} # 漂移量为1 
two three four five 
$ echo ${array[@]:1:2} # 量1,取2个 
two three

扩展-匹配移除

数组元素匹配移除(以元素为单位,针对所有元素)
# 从左向右进行最短匹配
## 从左向右进行最长匹配
% 从右向左进行最短匹配
%% 从右向左进行最长匹配

$ echo ${array[@]#t*e} # thre匹配移除 
one two e four five 
$ echo ${array[@]##t*e} # three匹配移除 
one two four five 
$ echo ${array[@]%r*e} # ree匹配移除 
one two th four five 
$ echo ${array[@]%%r*e} # ree匹配移除 
one two th four five

扩展-替换

/xx/yy 对每个元素只替换一次
//xx/yy 对每个元素替换多次
//x/ 删除匹配内容

$ echo ${array[@]/e/E} # three第二个e没替换 
onE two thrEe four fivE 
$ echo ${array[@]//e/E} # three第二个e没替换 
onE two thrEE four fivE 
$ echo ${array[@]//e/} # 最大匹配删除 
on two thr four fiv 
$ echo ${array[@]/e/} # 最小匹配删除 
on two thre four fiv

/#xx/yy front-end匹配(从左向右)
/%xx/yy back-end匹配(从右向左)

$ echo ${array[@]/#o/O} # two的o没替换 
One two three four five 
$ echo ${array[@]/%o/O} # one的o没替换 
one twO three four five

用函数替换

$ newstr() { 
> echo -n “!!!” 
> } 
$ echo ${array[@]/%e/$(newstr)} 
onXX two threXX four fivXX

扩展-添加元素

$ array=( “${array[@]}” “new1” ) 
$ echo ${array[@]} 
one two three four five new1 
$ array[${#array[@]}]=”new2” 
$ echo ${array[@]} 
one two three four five new1 new2

其他

read命令支持以-a参数从标准输入读入一个数组

$ read -a name 
11 22 33 
$ echo ${name[1]} 
22