学习笔记1

数组

定义

数组可以直接赋值使用,不需要提前声明。等号和小括号之间不能有空格,小括号中的元素以空格隔开。

arr=(aa cc vdsa dsaf)
#换行赋值
arr1=(aa
ff
"dd dasa"
saa)

元素读写

arr=(ad daf aa)
# 用法和取字符串的第几个字符一样,从 1 开始算
echo arr[1]#ad
#-1 依然是最后一个元素,-2 是倒数第二个,以此类推
echo arr[-1]#aa
# 如果赋值的内容是一个空的小括号,则删除该元素
echo arr[2]=()
# 用 += 为数组添加一个新元素
arr+=eeee
print -l $arr
#ad
#aa
#eeee
# 用 unset 可以删除整个数组
unset arr

数组拼接

arr1=(1 2 3)
arr2=(4 5 6)
# 拼接另一个数组,小括号不可以省略,否则 array1 会被转成一个字符串
arr1+=($arr2)
echo $arr1
#1 2 3 4 5 6
# 去掉小扩号后,array1 被转成了一个字符串
arr1+=$arr2
echo $#arr1 #7
echo $arr1
#1 2 3 4 5 6 (4 5 6)
# 字符串可以直接拼接数组而转化成数组
str=abc
str+=(a b c)
echo $#str #2
echo $str
#abc (a b c)

遍历

arr1=(aa ff aa "dfw dsaf")
arr2=(0 2 3 e)
# 用 for 可以直接遍历数组,小括号不可省略
for i ($arr1) {
	echo $i
}
#aa
#aa
#dfw dsaf
# 小括号里可以放多个数组,依次遍历
for i ($arr1 $arr2) {
	echo $i
}
#aa
#aa
#dfw dsaf
#0
#2
#3
#e

数组切片

数组切片和字符串切片操作方法完全相同。

arr=(aa d da a)
echo $srr[1,3] #aa d da
# 依然可以多对多地替换元素
arr[3,4]=(cc aa da)
echo $arr
#aa d cc aa da

元素查找

数组的元素查找方法,和字符串的子字符串查找语法一样。

arr=(aa cc da da 22 14 00 3)
# 用小 i 输出从左到右第一次匹配到的元素位置 # 如果找不到,返回数组大小 + 1
echo $arr[(i)cc] #2
# 用大 I 输出从右到左第一次匹配到的元素位置 # 如果找不到,返回 0
echo $arr[(I)22] #5 
# 可以用大 I 判断是否存在元素
(($arr[(I)da])) && echo good #good
# n:2: 从指定的位置开始查找
echo ${str[(in:3:)da]} #9

元素排序

arr=(aa CCC b DD e 000 AA 3 aa 22)
# 用小写字母 o 升序排列,从小到大
echo ${(o)arr} #000 22 3 aa aa AA b CCC DD e
# 用大写字母 O 降序排列,从大到小
echo ${(O)arr} #e DD CCC b AA aa aa 3 22 000
# 加 i 的话大小写不敏感
echo ${(oi)arr}#000 22 3 aa AA aa b CCC DD e
# 加 n 的话按数字大小顺序排
echo ${(on)arr}#000 3 22 aa aa AA b CCC DD e
# Oa 用于反转数组元素的排列顺序
echo ${(Oa)arr}#22 aa 3 AA 000 e DD b CCC aa

去除重复元素

array=(ddd a bb a ccc bb ddd)
echo ${(u)array}
#ddd a bb ccc

使用连续字符或者数值构造数组

str1="a d v s"
arr1=(${=str})
echo $arr#a d v s
str2="a:b:c"
arr2=(${(s.:.)str})
echo $arr2#a b c
str3="a##b##c"
arr3=(${(s:##:)str})
echo $arr3#a b c 

从文件构造数组

test.txt 内容

a
bb
ccc
dddd

每行一个元素

# f 的功能是将字符串以换行符分隔成数组
# 双引号不可省略,不然会变成一个字符串,引号也可以加在 ${ } 上
array=(${(f)"$(<test.txt)"})
print -l $array
#a
#bb
#ccc
#dddd
# 不加引号的效果
array=(${(f)$(<test.txt)})
print -l $array
#a bb ccc dddd
# 从文件构造数组,并将每行按分隔符 : 分隔后输出所有列
for i (${(f)"$(<test.txt)"}) {
    array=(${(s.:.)i})
    echo $array[1,-1]
}

数组交集差集

arr=(1 1 2 3)
arr=(1 1 2 4)
# 两个数组的交集,只输出两个数组都有的元素# 如果有重复元素,不会去重
echo ${arr1:*arr2}#1 1 2
# 两个数组的差集,只输出 array1 中有,而 array2 中没有的元素
echo ${arr1:|arr2}#3

数组交叉合并

arr1=(a b c)
arr2=(1 2 3 4)
# 从 array1 取一个,再从 array2 取一个,以此类推,一个数组取完了就结束
echo ${arr1:^arr2}#a1 b2 c3
# 如果用 :^^,只有一个数组取完了的话,继续从头取,直到第二个数组也取完了
echo ${arr1:^^arr2}#a1 b2 c3 a4

对数组中的字符串进行统一的处理

一些处理字符串的方法(主要是各种形式的截取、替换、转换等等),也可以用在数组上,效果是对数组中所有元素统一处理。

array=(/a/b.htm /a/c /a/b/c.txt)
# :t 是取字符串中的文件名,可以用在数组上,取所有元素的文件名
print -l $(array:t)
#b.htm
#c
#c.txt
# :e 是取扩展名,如果没有没有扩展名,结果数组中不会添加空字符串
print -l $(array:e)
#htm
#txt
# 字符串替换等操作也可以对数组使用,替换所有字符串
print -l $(array/a/j)
#/j/b.txt
#/j/c
#/j/b/c.txt

:# 也可以在数组上用,但更实用一些。

array=(aaa bbb ccc)
# :# 是排除匹配到的元素,类似 grep -v
print $(array:#b*)#aaa ccc
# 前边加 (M),是反转后边的效果,即只输出匹配到的元素,类似 grep
print $((M)array:#a*)#aaa
# 多个操作可以同时进行,(U) 是把字符串转成大写字母
print ${(UM)array:#a*}
#AAA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值