Shell变量-统计命令时长和截取、删除、替换、删除字符串和特殊shell扩展变量

统计命令执行时长

字符串⻓度计算,多种⽅法,谁最快?
速度⽐较

# 最快⽅式
# seq -s 指定分隔符
# seq -s ":" 100
# 执⾏3次打印的命令,打印出⼀个指定了分隔符的1~100的序列
for n in {1..3};do char=`seq -s ":" 100`;echo ${char} ;done

# 实践
root@icloudy:~# time for n in {1..10000};do char=`seq -s "w" 100`;echo ${#char} 

&>/dev/null;done
real 0m11.041s
user 0m4.585s
sys 0m6.232s

#计算速度很慢,管道符和wc -L
root@icloudy:~# time for n in {1..10000};do char=`seq -s "w" 100`;echo ${char}|wc -L &>/dev/null;done

real 0m38.577s
user 0m15.394s
sys 0m22.491s

# 性能还不错
root@icloudy:~# time for n in {1..10000};do char=`seq -s "w" 100`;expr length "${char}" &>/dev/null;done 

real 0m21.053s
user 0m8.673s
sys 0m11.944s

# awk再次加⼯,最慢
root@icloudy:~# time for n in {1..10000};do char=`seq -s "w" 100`;echo ${char}|awk '{print length($0)}' &>/dev/null ;done

real 0m33.728s
user 0m13.839s
sys 0m19.121s

shell编程,尽量⽤内置系统操作,与内置函数

截取字符串

基本语法:

# 从开头删除匹配最短
## 从开头删除匹配最⻓
% 从结尾删除匹配最短
%% 从结尾删除匹配最⻓

# 指定字符内容截取
a*c 匹配开头为a,中间任意个字符,结尾为c的字符串
a*C 匹配开头为a,中间任意个字符,结尾为C的字符串

#语法

name="wangjia"  # 该变量的值,有索引,分别是从 0,1,2,3,4开始

${变量}                 返回变量值
${#name}                返回变量⻓度,字符⻓度--------
${变量:start}           返回变量start数值之后的字符,且包含start的数字
${变量:start:length} 提取start之后的length限制的字符 ,例如${name:4:1}
${变量#word}            从变量开头删除最短匹配的word⼦串 ${name:yu}
${变量##word}           从变量开头,删除最⻓匹配的word
${变量%word}            从变量结尾删除最短的word
${变量%%word}           从变量结尾开始删除最⻓匹配的word

替换
${变量/pattern/string}   ⽤string代替第⼀个匹配的pattern
${变量//pattern/string} ⽤string代替所有的pattern

删除匹配的内容

root@icloudy:~# echo ${name} 
I am w

root@icloudy:~# echo ${name:2:2} #第⼆个开始,取2个
am

root@icloudy:~# name2=abcABC123ABCabc

# 从开头删除
root@icloudy:~# echo ${name2#a*C} #从开头删除最短的a*C
123ABCabc

root@icloudy:~# echo ${name2##a*C} #从开头删除最⻓的匹配
abc

# 从结尾删除
# 从结尾没有匹配到结果,原样返回
root@icloudy:~# echo ${name2%a*C}
abcABC123ABCabc

# 匹配到了就删除
root@icloudy:~# echo ${name2%a*c}
abcABC123ABC

# 匹配⻓的删除
# 删⼲净了,因为变量值name2=abcABC123ABCabc,匹配a*c,取最⻓的也就从前删到结尾
root@icloudy:~# echo ${name2%%a*c}

# 原样返回,因为从结尾开始匹配,压根就找不到a*C,因此不做处理
root@icloudy:~# echo ${name2%%a*C}
abcABC123ABCabc

替换字符串

root@icloudy:~# str1="Hello,man,i am your brother."
root@icloudy:~# echo $str1
Hello,man,i am your brother.

# ⼀个/ 替换匹配第⼀个合适的字符串
root@icloudy:~# echo ${str1/brother/sister}
Hello,man,i am your sister.

# 两个//,匹配所有的合适的字符串
# 替换所有的o为⼤写O
root@icloudy:~# echo ${str1//o/O}
HellO,man,i am yOur brOther.

删除⽂件名练习

删除所有图⽚⽂件名中的⼦串

1.去掉所有 _finished 字符串

思路:

1.单个⽂件去掉后缀,很简单
root@icloudy:~# mv stu_102999_1_finished.jpg stu_102999_1.jpg

2.通过⼦串的替换⽅式
root@icloudy:~# f=stu_102999_1_finished.jpg

# 变量的⼦串功能,去掉后缀
root@icloudy:~# echo ${f//_finished/}
stu_102999_1.jpg

# 利⽤变量的反引⽤替换⽂件名
root@icloudy:~# mv $f `echo ${f//_finished/}`
# 剩下的⽂件,利⽤循环操作
# 找出剩下所有需要替换的jpg⽂件
root@icloudy:~# ls *fin*.jpg
stu_102999_2_finished.jpg  stu_102999_3_finished.jpg  stu_102999_4_finished.jpg 
stu_102999_5_finished.jpg

# 写shell循环代码,循环操作
# 去掉所有jpg⽂件的_finished后缀
root@icloudy:~# for file in `ls *fin*.jpg`;do mv $file `echo ${file//_finished/}`;done

root@icloudy:~# ls *.jpg
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

特殊shell扩展变量处理

语法
parameter,参数,范围 如果parameter变量值为空,返回word字符串
${parameter:-word}

如果para变量为空,则word替代变量值,且返回其值
${parameter:=word}

如果para变量为空,word当作stderr输出,否则输出变量值 ⽤于设置变量为空导致错误时,返回的错误信息
${parameter:?word}

如果para变量为空,什么都不做,否则word返回
${parameter:+word}

扩展变量实践:

root@icloudy:~# echo $chaoge

# 当chaoge没有值,heihei被返回,赋值给result
root@icloudy:~# result=${chaoge:-heihei}
[root@chaogelinux str1]# echo $result
heihei
# 要注意的是,此时chaoge还是空
root@icloudy:~# echo $chaoge

# 情况2,当chaoge变量有值时,该特殊扩展变量的符号,也就不起作⽤了
root@icloudy:~# echo $chaoge
pangzi
root@icloudy:~# result=${chaoge:-heihei}
root@icloudy:~# echo $result
pangzi
root@icloudy:~# echo $chaoge
pangzi
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值