shell-变量子串

截取

在这里插入图片描述

按照下标截取

#截取字符串
[abc@centos ~]$ echo $name
adfafdsaf
#从第三位开始,截取五个字符
[abc@centos ~]$ echo ${name:3:5}
afdsa

内容删除

[abc@centos ~]$ name="abc123ABC456abc"
#从字符串前面开始,删掉短的"a*c"
[abc@centos ~]$ echo ${name#a*c}
123ABC456abc
#删掉长的"a*c"
[abc@centos ~]$ echo ${name##a*b}
c

"#“和”%"区别:

  • “#”:从前面开始删除
  • “%”:从后面开始删除
[abc@centos ~]$ echo ${name}
abc123ABC456abc
#错误示范
[abc@centos ~]$ echo ${name%b*a}
abc123ABC456abc
[abc@centos ~]$ echo ${name%%b*a}
abc123ABC456abc

[abc@centos ~]$ echo ${name}
abc123ABC456abc
#从后面开始找短的"a*c"去掉
[abc@centos ~]$ echo ${name%a*c}
abc123ABC456
#从后面开始找长的"a*c"去掉
[abc@centos ~]$ echo ${name%%a*c}

替换

[abc@centos ~]$ str="hhha"
[abc@centos ~]$ echo ${str/h/boy}
boyhha
[abc@centos ~]$ echo ${str//h/boy}
boyboyboya

统计长度

“#”

#联想特殊变量"$#"可以统计传递给脚本的参数个数,"$0","$1"...都代表一个参数;可以想到"$"代表变量,"#"代表个数
#定义变量测试的变量name,后面不再定义
[abc@centos ~]$ name="adfafdsaf"
[abc@centos ~]$ echo ${#name}
9

wc

参数用法记忆
-l统计行数line
-L打印最长行的长度大写的“l”,大(长)行
#创建一个测试文件
[abc@centos ~]$ vim test.txt
[abc@centos ~]$ cat test.txt
11aa
aaaaa
aaaaaa
#三行
[abc@centos ~]$ cat test.txt | wc -l
3
#最长行长度为6
[abc@centos ~]$ cat test.txt | wc -L
6

expr

[abc@centos ~]$ expr length "${name}"
9

awk

[abc@centos ~]$ echo "${name}" | awk '{print length($0)}'
9

统计命令执行时长

#通过time命令统计"#"执行时长
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${#char} &>/dev/null;done

real    0m0.632s
user    0m0.448s
sys     0m0.180s
#wc
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${char}|wc -l &>/dev/null;done

real    1m13.514s
user    0m21.037s
sys     1m32.785s
#expr
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";expr length "${char}" &>/dev/null;done

real    1m1.793s
user    0m7.315s
sys     0m59.825s
#awk
[abc@centos ~]$ time for n in {1..10000};do char="seq -s "aaa" 100";echo ${char} | awk '{print length($0)}' &>/dev/null;done

real    1m10.577s
user    0m20.375s
sys     1m25.084s

可以看出通过"#"统计字符串长度用时最少,减少脚本的运行时间要减少管道符和外部命令的使用

实例

批量修改文件名

先批量创建文件,实现批量修改文件名功能

#批量创建文件
[abc@centos ~]$ mkdir sub_str/
[abc@centos ~]$ cd sub_str/
[abc@centos sub_str]$ touch test_{1..5}_finished.jpg
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 93 18:59 test_1_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_5_finished.jpg
#1.通过mv命令修改单个文件名
[abc@centos sub_str]$ mv test_1_finished.jpg test_1.jpg
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 93 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_5_finished.jpg

#2.使用变量来去掉"_finished"
[abc@centos sub_str]$ f=test_1_finished.jpg
[abc@centos sub_str]$ echo $f
test_1_finished.jpg
[abc@centos sub_str]$ echo ${f//_finished/}
test_1.jpg

#3.使用反引号``
[abc@centos sub_str]$ mv `echo ${f}` `echo ${f//_finished/}`
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 93 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_2_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_3_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_4_finished.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_5_finished.jpg

#4.多次执行
#匹配有"_finished"字符的jpg文件
[abc@centos sub_str]$ ls *fin*.jpg
test_2_finished.jpg  test_4_finished.jpg
test_3_finished.jpg  test_5_finished.jpg
#for循环输出有"_finished"的文件名
[abc@centos sub_str]$ for file_name in `ls *fin*.jpg`;do echo ${file_name};done
test_2_finished.jpg
test_3_finished.jpg
test_4_finished.jpg
test_5_finished.jpg
#将"2.使用变量来去掉"_finished""和for循环组合起来使用
[abc@centos sub_str]$ for file_name in `ls *fin*.jpg`;do mv ${file_name} ${file_name//_finished/};done
[abc@centos sub_str]$ ll
总用量 0
-rw-rw-r--. 1 abc abc 0 93 18:59 test_1.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_2.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_3.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_4.jpg
-rw-rw-r--. 1 abc abc 0 93 18:59 test_5.jpg
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值