【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)

简介: 【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)

本篇文章继续给大家介绍Shell编程,包括变量切片、统计变量长度、变量子串删除、子串替换、七种方法进行数值运算、整数比较,多整数比较,字符串比对,正则比对,配合三剑客的高阶用法带大家深入了解Shell编程。


变量子串相关知识

变量子串是指在一个Shell变量中提取出一部分子串以供后续操作使用。子串可以理解为原字符串的片段。

一、变量切片

取出name变量中的te

1. [root@LB00 ~]# name='koten'
2. [root@LB00 ~]# echo $name|awk  -F '[on]' '{print $2}'
3. te

变量切片:分割方式

1. [root@LB00 ~]# echo ${name:2:2}
2. te

二、统计变量长度信息

4种统计方式

1. [root@LB00 ~]# echo $name|wc -L    #统计文本中最长行的长度
2. 5
3. 
4. [root@LB00 ~]# expr length "$name"
5. 5
6. 
7. [root@LB00 ~]# echo $name|awk '{print length}'
8. 5
9. 
10. [root@LB00 ~]# echo ${#name}
11. 5

示例:统计字符串小于3的单词或变量

1. #方法1
2. [root@LB00 Day02]# cat test.sh
3. #!/bin/bash
4. for i in I am koten I am 18
5. do
6.   [ ${#i} -lt 3 ] && echo $i    #if也行,条件判断式也行,${#i}的意思是赋值给i变量的长度
7. done
8. [root@LB00 Day02]# sh test.sh
9. I
10. am
11. I
12. am
13. 18
14. 
15. #方法2
16. [root@LB00 Day02]# name='I am koten I am 18'
17. [root@LB00 Day02]# echo $name|xargs -n1|awk '{if(length<3)print}'
18. I
19. am
20. I
21. am
22. 18
23. 
24. #方法3
25. [root@LB00 Day02]# name='I am koten I am 18'
26. [root@LB00 Day02]# echo $name|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
27. I
28. am
29. I
30. am
31. 18

三、变量子串删除

1. [root@LB00 Day02]# url=www.baidu.com
2. #方法1取baidu.com
3. [root@LB00 Day02]# echo $url|awk -F . '{print $2"."$3}'
4. baidu.com
5. 
6. #方法2取baidu.com
7. [root@LB00 Day02]# echo $url|awk -F 'w.' '{print $3}'
8. baidu.com
9. 
10. #方法3取baidu.com
11. [root@LB00 Day02]# echo ${url#*.}    #固定匹配
12. baidu.com
13. [root@LB00 Day02]# echo ${url##*.}   #贪婪匹配
14. com
15. [root@LB00 Day02]# echo ${url%.*}    #%从后往前删
16. www.baidu
17. [root@LB00 Day02]# echo ${url%%.*}   #%%贪婪匹配
18. www
19. [root@LB00 Day02]# num=11%
20. [root@LB00 Day02]# echo $num
21. 11%
22. [root@LB00 Day02]# echo ${num%\%}    #语法冲突用\
23. 11

四、子串替换

1. [root@LB00 Day02]# echo $url
2. www.baidu.com
3. [root@LB00 Day02]# echo $url|sed 's#www#aaa#g'
4. aaa.baidu.com
5. [root@LB00 Day02]# echo ${url/w/a}     #正常匹配
6. aww.baidu.com
7. [root@LB00 Day02]# echo ${url//w/a}    #贪婪匹配
8. aaa.baidu.com
9. [root@LB00 Day02]# echo ${url/baidu/sina}
10. www.sina.com

数值运算

一、运算方法

1、expr(只支持整数,不支持小数)

1. [root@LB00 Day02]# expr 1+1       #有输出功能
2. 1+1
3. [root@LB00 Day02]# expr 1 + 1
4. 2
5. [root@LB00 Day02]# expr 1 - 1
6. 0
7. [root@LB00 Day02]# expr 1 / 1
8. 1
9. [root@LB00 Day02]# expr 1 * 1     #*表示通配符,需要\
10. expr: syntax error
11. [root@LB00 Day02]# expr 1 \* 1
12. 1
13. [root@LB00 Day02]# expr 1 \* 1
14. 1
15. [root@LB00 Day02]# expr 10 % 3    #取余
16. 1

2、$(()),只支持整数,注意与$()区分,效率最高

1. [root@LB00 Day02]# echo $((100+10))
2. 110
3. [root@LB00 Day02]# echo $((100-10))
4. 90
5. [root@LB00 Day02]# echo $((100*10))
6. 1000
7. [root@LB00 Day02]# echo $((100/10))
8. 10
9. [root@LB00 Day02]# echo $((100%10))
10. 0
11. [root@LB00 Day02]# echo $((100^10))    #位异或
12. 110
13. #位异或是指,在两个二进制数的相同位置上,如果两个数的位值不同,则该位结果为1,否则结果为0。换句话说,位异或可以将两个二进制数的每一位取反。

3、$[],只支持整数

1. [root@LB00 Day02]# echo $[100+10]
2. 110
3. [root@LB00 Day02]# echo $[100-10]
4. 90
5. [root@LB00 Day02]# echo $[100*10]
6. 1000
7. [root@LB00 Day02]# echo $[100/10]
8. 10
9. [root@LB00 Day02]# echo $[100%10]
10. 0
11. [root@LB00 Day02]# echo $[100^10]
12. 110

4、let运算,只支持整数

主要用来统计循环次数

1. [root@LB00 Day02]# let i++
2. [root@LB00 Day02]# echo $i
3. 1
4. [root@LB00 Day02]# let a++
5. [root@LB00 Day02]# echo $a
6. 1
7. [root@LB00 Day02]# let a++
8. [root@LB00 Day02]# echo $a
9. 2
10. [root@LB00 Day02]# let a=a+2
11. [root@LB00 Day02]# echo $a
12. 4
13. [root@LB00 Day02]# let num=100+10
14. [root@LB00 Day02]# echo $num
15. 110

示例:let自增统计循环的次数

1. [root@LB00 Day02]# cat for.sh
2. #!/bin/bash
3. for a in a b c
4. do
5.   let i++
6. done
7. echo $i
8. [root@LB00 Day02]# sh for.sh
9. 3

i++和++i区别

1、直接运算是一样的

1. [root@LB00 Day02]# let i++
2. [root@LB00 Day02]# echo $i
3. 2
4. [root@LB00 Day02]# let ++i
5. [root@LB00 Day02]# echo $i
6. 3

2、有变量赋值时有区别

1. [root@LB00 ~]# a=1
2. [root@LB00 ~]# b=1
3. [root@LB00 ~]# let c=a++    #先赋值再运算
4. [root@LB00 ~]# let d=++b    #先运算再赋值
5. [root@LB00 ~]# echo $c    
6. 1
7. [root@LB00 ~]# echo $d
8. 2
9. [root@LB00 ~]# echo $a
10. 2
11. [root@LB00 ~]# echo $b
12. 2

5、bc,支持整数和部分小数

首先需要安装

1. yum -y install bc
2. [root@LB00 ~]# echo 1+1|bc
3. 2
4. [root@LB00 ~]# echo 1-1|bc
5. 0
6. [root@LB00 ~]# echo 1*1|bc
7. 1
8. [root@LB00 ~]# echo 1/1|bc
9. 1
10. [root@LB00 ~]# echo 1%1|bc
11. 0
12. [root@LB00 ~]# echo 1^1|bc
13. 1
14. [root@LB00 ~]# echo 100+18.5|bc
15. 118.5
16. [root@LB00 ~]# echo 100/18|bc     5.5省去了0.5
17. 5

6、awk支持整数和小数

1. [root@LB00 ~]# awk 'BEGIN{print 10+10.5}'
2. 20.5
3. [root@LB00 ~]# awk 'BEGIN{print 10-10.5}'
4. -0.5
5. [root@LB00 ~]# awk 'BEGIN{print 10*10.5}'
6. 105
7. [root@LB00 ~]# awk 'BEGIN{print 10/10.5}'
8. 0.952381
9. [root@LB00 ~]# awk 'BEGIN{print 10%10.5}'
10. 10
11. [root@LB00 ~]# awk 'BEGIN{print 10^10.5}'
12. 3.16228e+10
13. [root@LB00 ~]# awk 'BEGIN{print 10-5*2}'
14. 0
15. [root@LB00 ~]# num1=10
16. [root@LB00 ~]# num2=5
17. [root@LB00 ~]# awk -v num1=$num1 -v num2=$num2 'BEGIN{print num1+num2}' #-v传变量进awk
18. 15

7、python支持整数和小数

1. [root@LB00 ~]# python
2. Python 2.7.5 (default, Oct 14 2020, 14:45:30) 
3. [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
4. Type "help", "copyright", "credits" or "license" for more information.
5. >>> 10+10
6. 20
7. >>> 10-10
8. 0
9. >>> 10*10
10. 100
11. >>> 10/10
12. 1
13. >>> 10%10
14. 0
15. >>> 10^10
16. 0
17. [1]+  Stopped                 python    ctrl+z退出

示例一:根据三种传参方式结合上面运算方式写计算器

1、直接传参

1. [root@LB00 Day02]# cat jisuanqi_1.sh 
2. #!/bin/bash
3. echo $1+$2=$[$1+$2]
4. echo $1-$2=$[$1-$2]
5. echo $1*$2=$[$1*$2]
6. echo $1/$2=$[$1/$2]
7. echo $1%$2=$[$1%$2]
8. echo $1^$2=$[$1^$2]
9. [root@LB00 Day02]# sh jisuanqi_1.sh 100 10
10. 100+10=110
11. 100-10=90
12. 100*10=1000
13. 100/10=10
14. 100%10=0
15. 100^10=110

2、赋值传参

1. [root@LB00 Day02]# cat jisuanqi_2.sh
2. #!/bin/bash
3. num1=$1
4. num2=$2
5. echo $num1+$num2=$[$num1+$num2]
6. echo $num1-$num2=$[$num1-$num2]
7. echo $num1*$num2=$[$num1*$num2]
8. echo $num1/$num2=$[$num1/$num2]
9. echo $num1%$num2=$[$num1%$num2]
10. echo $num1^$num2=$[$num1^$num2]
11. [root@LB00 Day02]# sh jisuanqi_2.sh 10 5
12. 10+5=15
13. 10-5=5
14. 10*5=50
15. 10/5=2
16. 10%5=0
17. 10^5=15
目录
相关文章
|
4天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
JavaScript 关系型数据库 Shell
Linux shell编写技巧之随机取字符串(一)
本文介绍了Linux Shell脚本的编写技巧,包括环境配置、变量命名规则和缩进语法,并提供了一个实例练习,展示如何使用`$RANDOM`变量和`md5sum`命令来生成随机的8位字符串。
37 4
|
2月前
|
Shell Linux 网络安全
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
在Linux中,如何利用Shell把10台主机的当前时间写到一个文件里边?
|
2月前
|
Shell Linux 开发工具
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
|
3月前
|
Shell 测试技术 Linux
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
37 3
|
2月前
|
Shell Linux Perl
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
|
4月前
|
SQL 存储 关系型数据库
精通MySQL:从基础到高级运维实战
第一章:MySQL入门与基础 1.1 MySQL概述 简要介绍MySQL的历史、发展及其在数据库领域的地位
|
4月前
|
监控 Shell 开发者
Shell 字符串操作:让你的脚本语言更加灵活
在Shell脚本中,字符串操作至关重要,包括计算长度、连接与截取。获取字符串长度使用`${#变量名}`,如`echo ${#name}`显示`4`。字符串连接可通过`$变量名`或`${变量名}`实现,例如`name=alex; str1=$name$age`。字符串截取有多种方式,如`${str:起始位置:长度}`从左边截取,`${str#*chars}`从左边去除匹配的字符,`${str%*chars}`则从右边去除。通过练习这些基本操作,能提升Shell脚本的编写效率。
24 0
|
13天前
|
机器学习/深度学习 运维 Prometheus
构建高效运维体系:从自动化部署到智能监控的全方位实践
在当今数字化时代,企业对运维效率和稳定性的要求越来越高。本文将探讨如何构建一个高效的运维体系,从自动化部署、持续集成与持续交付(CI/CD)、智能监控、故障管理以及数据驱动决策等方面进行深入分析和实践指导。通过这些方法,企业可以实现更快速、更可靠的软件发布和问题解决,提升整体运营效率。
|
9天前
|
敏捷开发 运维 Prometheus
构建高效运维体系:从基础架构到自动化管理
本文探讨了如何通过优化基础架构、引入自动化工具和流程,以及加强团队协作,构建高效的运维体系。通过案例分析和实践建议,帮助运维人员实现系统的稳定性、可靠性和可维护性。
下一篇
无影云桌面