快捷查看指令 ctrl+f 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改)
字符串操作
字符串截取
# 从开头删除匹配最短 pcabcabc [p*c] -----> abcabc
## 从开头删除匹配最长 pab6666666c [p*c] -----> 空
% 从结尾删除匹配最短 pcabcapbc [p*c] -----> pcabca
%% 从结尾匹配删除最长 pcabcapbc [p*c] ----> 空
${变量名/匹配模式/新值} 用新值替换第一个满足匹配模式的子字符串
${变量名//匹配模式/新值} 用新值代替所有满足匹配模式的子字符串
// 指定匹配内容截取
a*c 匹配开头是 a 中间任意个字符 结尾是 c 的字符串 例如:ac abc a123456c
测试数据:
str1=1234568765432112
案例1. ${#变量名}
[root@centos-128 ~]# echo ${#str1}
16
案例2. ${变量名:start}
[root@centos-128 ~]# echo ${str1:5}
68765432112
案例3. ${变量名:start:length}
[root@centos-128 ~]# echo ${str1:3:5}
45687
案例4. # 与 ## 演示
[root@centos-128 ~]# echo ${str1#1*3}
4568765432112
[root@centos-128 ~]# echo ${str1##1*3}
2112
案例5. % 与 %% 演示
[root@centos-128 ~]# echo ${str1%3*2}
12345687654
[root@centos-128 ~]# echo ${str1%%3*2}
12
案例6. / 与 // 演示
[root@centos-128 ~]# echo ${str1/12/a}
a34568765432112
[root@centos-128 ~]# echo ${str1//12/a}
a345687654321a
统计字符串长度
测试数据:
str1=1234568765432112
方法1: ${#变量名} ---- 效率最高
[root@centos-128 ~]# time echo ${#str1} #获取指令执行时长
16
real 0m0.000s
user 0m0.000s
sys 0m0.000s
方法2:
[root@centos-128 ~]# time echo ${str1} | wc -L
16
real 0m0.001s
user 0m0.001s
sys 0m0.000s
方法3:
[root@centos-128 ~]# time expr length ${str1}
16
real 0m0.002s
user 0m0.000s
sys 0m0.001s
方法4:
[root@centos-128 ~]# time echo ${str1} | awk '{print length ($0) }'
16
real 0m0.002s
user 0m0.001s
sys 0m0.001s
time指令 , 统计某条指令的执行时长
#shell编程,尽量使用linux内置的命令,内置的操作,内置的函数 效率最高 尽可能减少 管道符的操作#
shell扩展变量
使用变量: a,z(初始值为空)
扩展变量1: result={param:-word} #此处result param 均为自定义变量,无特殊含义
如果param变量中保存的值为空,则word 赋值给result; param变量中有值,返回param的值
[root@centos-128 ~]# a=${z:-123456}
[root@centos-128 ~]# echo $a # a 的值为123456
123456
[root@centos-128 ~]# echo $z # z的值为空
扩展变量2: result={param:=word}
如果param变量中保存的值为空 则 word 赋值给 param 同时 赋值给 result;param变量中有值,返回param的值
[root@centos-128 ~]# a=${z:=123456}
[root@centos-128 ~]# echo $a
123456
[root@centos-128 ~]# echo $z
123456
扩展变量3: ${param:?word}
如果param变量中保存的值为空,将word当做标准错误输出 否则 输出 param的变量值
[root@centos-128 ~]# a=${z:?123456}
-bash: z: 123456
[root@centos-128 ~]# z=567
[root@centos-128 ~]# a=${z:?123456}
[root@centos-128 ~]# echo $a
567
扩展变量4: ${param:+word}
如果param变量中保存的值为空,什么都不做;如果有值 将 word返回
[root@centos-128 ~]# a=${z:+123456}
[root@centos-128 ~]# echo $a # a的值为空
[root@centos-128 ~]# echo $z # z的值为空
[root@centos-128 ~]# z=567
[root@centos-128 ~]# a=${z:+123456}
[root@centos-128 ~]# echo $a
123456
父子shell
:查看父子shell的关系
pstree
ps -ef
-f 展示 UID PID PPID
-e 列处所有进程信息
ps -ef --forest
假设不开启子shell
# 脚本根据业务需求,需要填充大量的、复杂的、耗时的指令操作
cd ~;ls;pwd;echo "小黑";.........
## 业务要求的复杂shell组合 在执行结束前 父shell在窗口中只能等待
shell的进程列表 : 需要使用 () 将这组指令包括进去 ------- 这种方式就称之为 进程列表
(cd ~;ls;pwd;echo "小黑";.........) --- 这些指令是交给多个 子 shell执行
检测是否在子shell环境中
linux默认的有关shell的变量
BASH_SUBSHELL
该变量的值的特点
如果是 0 就处于当前shell环境中执行 否则 就是开辟了子shell去执行
[root@bai ~]# (cd ~;ls;pwd;echo "小黑黑");echo $BASH_SUBSHELL
anaconda-ks.cfg baizhi cronDemo.sh
/root
小黑黑
0
## 一个父shell下开启多个平行的子shell去执行指令执行以后,自行回到父shell
子shell嵌套运行
[root@bai ~]# (pwd;(pwd;(echo $BASH_SUBSHELL)))
/root
/root
3
利用括号,开启子shell 。在shell脚本的开发中,使用子shell进行多线程的处理,提高程序的并发效率