本篇文章继续给大家介绍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