shell数组
基础
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]}
1
$ 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[@]}
4
$ 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