Shell中数据类型不多,比如说字符串,数字类型,数组。数组是其中比较重要的一种,同时Shell中的数组不像JAVA/C,只能是一维数组,没有二维数组;数组元素大小无约束,也无需先定义数组的元素个数;但其索引则像JAVA/C/Python,从0开始,下面是我学习过程的一些总结。
定义:
shell的定义和python相似格式如下
# 变量名=(值 值 值) 值之间用空格或换行隔开arr=(1 2 3 4)# 逐个赋值arr[o]=1arr[1]=2arr[2]=3arr[3]=4arr=([o]=1 [1]=2 arr[2]=3 arr[3]=4)
数组的基本操作
获取数组
读取某个下标的值:${数组名[下标]}
获取数组长度:${#数组名[@/*]} 即${#数组名[*]}或${#数组名[@]}
求元素长度: ${#数组名[index]}
expr length ${数组名[index]}
${数组名[index]} | wc -L
添加数组
- 直接添加 数组[index]=值 index大于数组长度则在最后添加
- 利用旧数组创建新的 newArrays=(${old[*]} 值)
修改数组
- 直接修改 数组[index]=值
删除数组
- 删除元素 unset 数组[index]
- 删除数组 unset 数组
数组的截取
和字符串相似,可以和字符串的方法对比着看。
假设有变量
arr=(1 2 3 4 5 6 )var=(book food)
1. # 号截取,从左到右进行最短匹配查找。
echo ${var[@]#b*o}
其中 var 是变量名,# 号是运算符,b*o 表示从左边开始查找
即删除 bo
结果是 :ok food
2. ## 号截取,从左到右进行最长匹配查找
echo ${var##b*o}
即删除boo
结果是 k food
3. %号截取,从右到左进行最短匹配查找
echo ${var%o*d}
%/* 表示从右边开始,删除第一个 od
结果是:book fo
4. %% 号截取,删从右到左进行最长匹配查找
echo ${var%%o*d}
%% 表示从右边开始,删除最后(最右边边)一个 o0d号
结果是:book f
5. 从左边第几个字符开始,及字符的个数
echo ${arr[@]:0:2}echo ${arr[@]::2} #两个一样
其中的 0 表示左边第一个字符开始,2 表示字符的总个数。
结果是:1 2
6. 从左边第几个字符开始,一直到结束。
echo ${arr[@]:1}
其中的 1表示左边第2个字符开始,一直到结束。
结果是 :3 4
7. 从右边第几个字符开始,及字符的个数
echo ${var[@]:(-2):2}
其中的 -2表示右边算起第2个字符开始,2表示字符的个数。
结果是:3 4
8.元素切片
names=(Jerry Alice David Wendy)echo $(names[0]:0) # 从0开始取所有 Jerryecho $(names[0]:1:2) # 从0开始取2个 erecho $(names[0]:6) #超出显示空行
数组替换
- ${array[@]/x/y} 最小匹配替换,每个元素只替换一次
- ${array[@]//x/y} 最大匹配替换,每个元素可替换多次
- ${array[@]/x/} 最小匹配删除,只删除一个符合规定的元素
- ${array[@]//x/} 最大匹配删除,可删除多个符合规定的元素
这个和前面相似就不举例子了。