我正在寻找与中的建议类似的东西这个答案:
给定一个 zsh 数组,我想要计算有多少元素与模式匹配(而不是获取第一个/最后一个匹配或第一个/最后一个匹配的索引,就像rRiI
下标标志所做的那样)。
myarray=(-test.list -test.v -c spam fiddle)
if ((${myarray[(I)-test.*]})); then
echo "there is at least one test flag"
echo "there are <solution here> test flags"
if ((<solution here> >= 5)); then
echo "seriously, there are many test flags"
fi
fi
理想情况下,这应该可以与切片结合起来
if ((${array[2,$end][(I)-test.*]})); then
echo "there are <solution> test flag(s) in the range I consider interesting"
fi
答案1
结合三个参数扩展特征:
${…:#PATTERN}
过滤匹配的元素PATTERN
;(M)
保留匹配元素(如果没有此标志,过滤器将删除匹配元素);${#…}
计算结果元素。
if [[ -n ${(M)myarray:#-test.*} ]]; then
echo "there are ${(M)#myarray:#-test.*} test flags"
…
您甚至可以将其与下标结合起来。
% echo ${(M)#myarray[1,-1]:#-test*}
2
% echo ${(M)#myarray[2,-1]:#-test*}
1