【运维知识高级篇】超详细的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
目录
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
1月前
|
存储 运维 监控
API明细日志及运维统计日志全面提升API可运维性
在数字化转型的大潮中,数据已成为企业最宝贵的资产之一。而数据服务API可快速为数据应用提供数据接口。面对越来越多的API以及越来越多的应用调用,如何快速查看API的服务情况、异常情况及影响范围,以及查看API的调用详情,进行API的性能优化、错误排查变得越来越重要,本文将介绍如何配置和开通API运维统计及明细日志,以及如何查看日志进行介绍。
|
2月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
176 56
|
4月前
|
数据采集 运维 Devops
探索Python编程之美:从基础到进阶自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第30天】在数字化时代的浪潮中,编程已经成为一门重要的技能。Python以其简洁明了的语法和强大的功能,成为了许多初学者的首选编程语言。本文将通过浅显易懂的语言,带领读者从Python的基础语法出发,逐步深入到面向对象编程、网络爬虫开发以及数据分析等高级应用,旨在帮助初学者构建扎实的编程基础,并激发他们进一步探索编程世界的热情。文章不仅分享实用的编程技巧,还将探讨如何将编程知识应用于解决实际问题,以期培养读者的问题解决能力和创新思维。
|
4月前
|
机器学习/深度学习 运维 Ubuntu
自动化运维:使用Ansible简化日常任务探索Python编程之美:从基础到进阶
【8月更文挑战第28天】在快速迭代的软件开发周期中,运维工作的效率至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化日常的运维任务,通过代码示例展示如何配置和使用Ansible,以及它如何帮助提升工作效率和减少人为错误。文章将深入讨论Ansible的核心概念,包括Playbooks和Tasks,并探讨如何利用这些概念进行高效的系统管理。 【8月更文挑战第28天】在数字时代的浪潮中,编程已成为一门艺术和科学。本文将通过Python语言的镜头,带领读者踏上一段从零基础到熟练运用的旅程。我们将一起探索Python的简洁语法、强大库支持以及它在数据科学、网络开发等领域的应用。无论你
|
4月前
|
数据采集 运维 监控
运维笔记:流编辑器sed命令用法解析
运维笔记:流编辑器sed命令用法解析
68 5
|
4月前
|
Shell Linux Perl
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
在Linux中,编写一个shell脚本,用于统计指定目录下所有文件的行数。
|
5月前
|
SQL Rust 算法
开发与运维编程问题之常见的编程范式的声明式编程如何解决
开发与运维编程问题之常见的编程范式的声明式编程如何解决
|
5月前
|
运维
开发与运维编程问题之命令式编程的优点如何解决
开发与运维编程问题之命令式编程的优点如何解决
|
5月前
|
运维
开发与运维编程问题之常见的编程范式的响应式编程如何解决
开发与运维编程问题之常见的编程范式的响应式编程如何解决