liunx的数组及字符串处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了liunx的数组及字符串处理相关的知识,希望对你有一定的参考价值。
一丶数组1.定义
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的
集合
数组名和索引
索引:编号从0开始,属于数值索引
#注意:索引可支持使用自定义的格式,而不仅是数值格式
,即为关联索引,bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)
2.常用命令及选项
declare -x varname 设置环境变量
declare -i 声明整数
declare -g 设置函数为全局函数
declare -xf 设置环境函数
declare -a 数组名 声明索引数组
declare -A 数组名 声明关联数组
declare -a 查看所有索引数组
declare -A 查看所有关系数组
3.数组一般格式
title[0]=boss
title[1]=ceo
title[2]=coo
title[3]=cto
~]# name=(liubei guanyu zhangfei zhaoyun)
~]# course=([0]=linux [2]=python [5]=oracle)~]# read -a menu
huimian lamian yanroutangscript=(/root/t*.sh)
digit=({1..20})
例1:
数组赋值
~]# digit=(1 3 5)
数组的引用
~]# echo $digit $数组名 仅引用第一个值
1~]# echo ${digit[1]} 指定下标以引用指定值
3
引用所有值
~]# echo ${digit[*]}
1 3 5
~]# echo ${digit[@]}
1 3 5
打印数量
~]# echo ${#digit[@]}
3
引用最后一个值
~]# echo ${digit[$[${#digit[@]}-1]]}
5
例2
分别显示每一个值,每个值换一行。
如
~]# for n in $(seq 0 $[${#testshuzu[*]}-1]);do
echo testshuzu[$n] is ${testshuzu[$n]}
done~]# testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun
4.数组常用选项
在索引数组中加值,加到最后
~]# testshuzu[${#testshuzu[]}]=machao
~]# for n in $(seq 0 $[${#testshuzu[]}-1]);do echo testshuzu[$n] is ${testshuzu[$n]}; done
testshuzu[0] is liubei
testshuzu[1] is guanyu
testshuzu[2] is zhaofei
testshuzu[3] is huangzhong
testshuzu[4] is zhaoyun
testshuzu[5] is machao
删除数组中的某个值
~]# unset testshuzu[1]
删除整个数组
~]# unset testshuzu
数组的切片
offset: 要跳过的元素个数
number: 要取出的元素个数
取偏移量之后的所有元素
~]# echo ${testshuzu[]:1:3}
zhaofei weiyan zhaoyun
~]# echo ${testshuzu[]:1} 跳过一个值,取到最后
zhaofei weiyan zhaoyun machao machao
关联数组
两种方式:
一:先声明,再赋值
~]# declare -A testshuzu
~]# testshuzu=([zhugong]=liubei [erdi]=guanyu [sandi]=zhangfei)
二:声明,赋值一步到位
declare -A weiguo=([chengxiang]=caocao [junshi]=simayi [jiangju]=xiahoudun )
例3
写一个脚本会生成一个名为digit的数组包含10个随机数,显示数组的所有值,再显示最大值,最小值。
#!/bin/bash
declare -i min max #声明最大值和最小值
declare -a digit #创建数组名
for ((i=0;i<10;i++));do #从0开始循环,循环10次
digit[$i]=$RANDOM #数组是随机数
[ $i -eq 0 ] && min=${digit[0]} && max=${digit[0]} && continue #将第一次随机数赋给最大最小值进行下次循环
[ ${digit[$i]} -gt $max ] && max=${digit[$i]} && continue #上一次随机数和这一次相比 取最大值
[ ${digit[$i]} -lt $min ] && min=${digit[$i]} && continue #上一次随机数和这一次相比 取最小值
done
echo All digit are ${digit[*]} #输出所有随机数
echo Max is $max
echo Min is $min
编写脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;统计出其下标为偶数的文件中的行数之和
#!/bin/bash
Sum=0
File=(/var/log/.log) #创建数组
for ((i=0;i<=$[${#File[]}-1];i++));do #循环到所有数组
if [ $[$i%2] -eq 0 ];then #判断是否为偶数文件
Line=$(cat ${File[$i]} | wc -l) #统计偶数文件行数
Sum=$[$Sum+$Line] #将每次循环的文件行数加起来
fi
done
echo $Sum
二丶字符串处理
~]# echo ${name}
dema西亚
~]# echo ${name:2:3} #从左边跳过2个字符,取3个字符
ma西
~]# echo ${name:2} #从左边跳过2个字符,取到最后
ma西亚~]# echo ${name: -2} #从右向左取2个字符,注意冒号后至少打一个空格
西亚~]# echo ${name: -3: 1} #从右向左取3个字符,再从左向右取1个字符
a
~]# echo ${name: -3: -1} #从右向左取3个字符,再从右向左去掉1个字符
a西
~]# echo ${name:3:-1} #从左边跳过3个字符,从右边跳过1个字符
a西
从左至右查找
~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH#local}
/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH##local} #贪婪模式
/bin:/usr/sbin:/usr/bin:/root/bin
从左至右查找
~]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# echo ${PATH%local}
/usr/local/sbin:/usr/
~]# echo ${PATH%%local}
/usr/
查找替换
~]# ${var/pattern/substr} #查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
~]# ${var//pattern/substr} #查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
~]# ${var/#pattern/substr} #查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
~]# ${var/%pattern/substr} #查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
查找并删除
~]# ${var/pattern} #删除var所表示的字符串中第一次被pattern所匹配到的字符串
~]# ${var//pattern} #删除var所表示的字符串中所有被pattern所匹配到的字符串
~]# ${var/#pattern} #删除var所表示的字符串中所有以pattern为行首所匹配到的字符串
~]# ${var/%pattern} #删除var所表示的字符串中所有以pattern为行尾所匹配到的字符串
大小写转换
~]# name="Zhangfei LiuBeI"
~]# echo ${name,,}
zhangfei liubei
~]# echo ${name^^}
ZHANGFEI LIUBEI
以上是关于liunx的数组及字符串处理的主要内容,如果未能解决你的问题,请参考以下文章