【运维知识高级篇】超详细的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
目录
相关文章
|
19天前
|
存储 运维 Shell
shell中for while until 三种循环的用法
shell编程中,有几种常见的循环结构,包括for循环、while循环和until循环,总的来说,循环shell编程中扮演着至关重要的角色,它们使得自动化任务变得更加容易,提高了效率,并且可以处理各种各样的编程需求。
shell中for while until 三种循环的用法
|
2月前
|
Shell Linux
Linux下的Shell基础——变量、运算符、条件判断(二)
Linux下的Shell基础——变量、运算符、条件判断(二)
47 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 文档编辑 】Linux 递归搜索指定字符串 rgrep命令使用指南
【Shell 命令集合 文档编辑 】Linux 递归搜索指定字符串 rgrep命令使用指南
17 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 文档编辑】Linux 在文件中查找指定的字符串 fgrep命令使用指南
【Shell 命令集合 文档编辑】Linux 在文件中查找指定的字符串 fgrep命令使用指南
39 2
|
19天前
|
Shell Perl
shell学习(九) 【shell sed用法】
shell学习(九) 【shell sed用法】
9 0
|
26天前
|
Shell
【shell】shell命令行放在变量中执行以及变量的常用方法
【shell】shell命令行放在变量中执行以及变量的常用方法
|
1月前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
1月前
|
Shell 程序员 Linux
【Shell 编程指南】shell运算操作符之(())
【Shell 编程指南】shell运算操作符之(())
19 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 内建命令】⭐Linux 声明变量的属性和类型 declare命令 使用指南
【Shell 命令集合 系统设置 内建命令】⭐Linux 声明变量的属性和类型 declare命令 使用指南
29 0
|
1月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑 内建命令】Linux数值运算和赋值操作 let命令使用指南
【Shell 命令集合 文档编辑 内建命令】Linux数值运算和赋值操作 let命令使用指南
26 0