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

目录

变量子串相关知识

一、变量切片

二、统计变量长度信息

三、变量子串删除

四、子串替换

数值运算

一、运算方法

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

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

3、$[],只支持整数

4、let运算,只支持整数

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

6、awk支持整数和小数

7、python支持整数和小数

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

1、直接传参

2、赋值传参

3、read交互式传参

4、交互式传参,可以填运算符

5、赋值传参,可以算小数

整数比较

一、比较符

二、语法

1、test 整数1 比较符 整数2

2、[ 整数1 比较符 整数2 ] 注意两边都有空格

3、表达式中都支持变量

4、表达式中都支持命令

5、多整数比较

三、示例

1、统计磁盘使用率,大于10%则告警发送邮件,小于10%则提示磁盘使用正常,当前使用率是多少

2、内存使用率告警

3、负载使用率告警

文件判断

一、判断符

二、语法

1、test 判断符 文件或目录

2、[ 判断符 文件或目录 ]

三、示例

1、目录存在则不管,不存在则创建

2、目录存在则打包

3、bash脚本变量在当前shell中调用

字符串比对

正则比对

示例一:控制输入内容格式

扩展(配合三剑客取系统信息)

变量子串相关知识

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

一、变量切片

取出name变量中的te

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

变量切片:分割方式

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

二、统计变量长度信息

4种统计方式

[root@LB00 ~]# echo $name|wc -L    #统计文本中最长行的长度
5
 
[root@LB00 ~]# expr length "$name"
5
 
[root@LB00 ~]# echo $name|awk '{print length}'
5
 
[root@LB00 ~]# echo ${#name}
5

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

#方法1
[root@LB00 Day02]# cat test.sh
#!/bin/bash
for i in I am koten I am 18
do
  [ ${#i} -lt 3 ] && echo $i    #if也行,条件判断式也行,${#i}的意思是赋值给i变量的长度
done
[root@LB00 Day02]# sh test.sh
I
am
I
am
18
 
#方法2
[root@LB00 Day02]# name='I am koten I am 18'
[root@LB00 Day02]# echo $name|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
 
#方法3
[root@LB00 Day02]# name='I am koten I am 18'
[root@LB00 Day02]# echo $name|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
I
am
I
am
18

三、变量子串删除

[root@LB00 Day02]# url=www.baidu.com
#方法1取baidu.com
[root@LB00 Day02]# echo $url|awk -F . '{print $2"."$3}'
baidu.com
 
#方法2取baidu.com
[root@LB00 Day02]# echo $url|awk -F 'w.' '{print $3}'
baidu.com
 
#方法3取baidu.com
[root@LB00 Day02]# echo ${url#*.}    #固定匹配
baidu.com
[root@LB00 Day02]# echo ${url##*.}   #贪婪匹配
com
[root@LB00 Day02]# echo ${url%.*}    #%从后往前删
www.baidu
[root@LB00 Day02]# echo ${url%%.*}   #%%贪婪匹配
www
[root@LB00 Day02]# num=11%
[root@LB00 Day02]# echo $num
11%
[root@LB00 Day02]# echo ${num%\%}    #语法冲突用\
11

四、子串替换

[root@LB00 Day02]# echo $url
www.baidu.com
[root@LB00 Day02]# echo $url|sed 's#www#aaa#g'
aaa.baidu.com
[root@LB00 Day02]# echo ${url/w/a}     #正常匹配
aww.baidu.com
[root@LB00 Day02]# echo ${url//w/a}    #贪婪匹配
aaa.baidu.com
[root@LB00 Day02]# echo ${url/baidu/sina}
www.sina.com

数值运算

一、运算方法

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

[root@LB00 Day02]# expr 1+1       #有输出功能
1+1
[root@LB00 Day02]# expr 1 + 1
2
[root@LB00 Day02]# expr 1 - 1
0
[root@LB00 Day02]# expr 1 / 1
1
[root@LB00 Day02]# expr 1 * 1     #*表示通配符,需要\
expr: syntax error
[root@LB00 Day02]# expr 1 \* 1
1
[root@LB00 Day02]# expr 1 \* 1
1
[root@LB00 Day02]# expr 10 % 3    #取余
1

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

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

3、$[],只支持整数

[root@LB00 Day02]# echo $[100+10]
110
[root@LB00 Day02]# echo $[100-10]
90
[root@LB00 Day02]# echo $[100*10]
1000
[root@LB00 Day02]# echo $[100/10]
10
[root@LB00 Day02]# echo $[100%10]
0
[root@LB00 Day02]# echo $[100^10]
110

4、let运算,只支持整数

主要用来统计循环次数

[root@LB00 Day02]# let i++
[root@LB00 Day02]# echo $i
1
[root@LB00 Day02]# let a++
[root@LB00 Day02]# echo $a
1
[root@LB00 Day02]# let a++
[root@LB00 Day02]# echo $a
2
[root@LB00 Day02]# let a=a+2
[root@LB00 Day02]# echo $a
4
[root@LB00 Day02]# let num=100+10
[root@LB00 Day02]# echo $num
110

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

[root@LB00 Day02]# cat for.sh
#!/bin/bash
for a in a b c
do
  let i++
done
echo $i
[root@LB00 Day02]# sh for.sh
3

i++和++i区别

1、直接运算是一样的

[root@LB00 Day02]# let i++
[root@LB00 Day02]# echo $i
2
[root@LB00 Day02]# let ++i
[root@LB00 Day02]# echo $i
3

2、有变量赋值时有区别

[root@LB00 ~]# a=1
[root@LB00 ~]# b=1
[root@LB00 ~]# let c=a++    #先赋值再运算
[root@LB00 ~]# let d=++b    #先运算再赋值
[root@LB00 ~]# echo $c    
1
[root@LB00 ~]# echo $d
2
[root@LB00 ~]# echo $a
2
[root@LB00 ~]# echo $b
2

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

首先需要安装

yum -y install bc
[root@LB00 ~]# echo 1+1|bc
2
[root@LB00 ~]# echo 1-1|bc
0
[root@LB00 ~]# echo 1*1|bc
1
[root@LB00 ~]# echo 1/1|bc
1
[root@LB00 ~]# echo 1%1|bc
0
[root@LB00 ~]# echo 1^1|bc
1
[root@LB00 ~]# echo 100+18.5|bc
118.5
[root@LB00 ~]# echo 100/18|bc     5.5省去了0.5   
5    

6、awk支持整数和小数

[root@LB00 ~]# awk 'BEGIN{print 10+10.5}'
20.5
[root@LB00 ~]# awk 'BEGIN{print 10-10.5}'
-0.5
[root@LB00 ~]# awk 'BEGIN{print 10*10.5}'
105
[root@LB00 ~]# awk 'BEGIN{print 10/10.5}'
0.952381
[root@LB00 ~]# awk 'BEGIN{print 10%10.5}'
10
[root@LB00 ~]# awk 'BEGIN{print 10^10.5}'
3.16228e+10
[root@LB00 ~]# awk 'BEGIN{print 10-5*2}'
0
[root@LB00 ~]# num1=10
[root@LB00 ~]# num2=5
[root@LB00 ~]# awk -v num1=$num1 -v num2=$num2 'BEGIN{print num1+num2}' #-v传变量进awk
15

7、python支持整数和小数

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

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

1、直接传参

[root@LB00 Day02]# cat jisuanqi_1.sh 
#!/bin/bash
echo $1+$2=$[$1+$2]
echo $1-$2=$[$1-$2]
echo $1*$2=$[$1*$2]
echo $1/$2=$[$1/$2]
echo $1%$2=$[$1%$2]
echo $1^$2=$[$1^$2]
[root@LB00 Day02]# sh jisuanqi_1.sh 100 10
100+10=110
100-10=90
100*10=1000
100/10=10
100%10=0
100^10=110

2、赋值传参

[root@LB00 Day02]# cat jisuanqi_2.sh
#!/bin/bash
num1=$1
num2=$2
echo $num1+$num2=$[$num1+$num2]
echo $num1-$num2=$[$num1-$num2]
echo $num1*$num2=$[$num1*$num2]
echo $num1/$num2=$[$num1/$num2]
echo $num1%$num2=$[$num1%$num2]
echo $num1^$num2=$[$num1^$num2]
[root@LB00 Day02]# sh jisuanqi_2.sh 10 5
10+5=15
10-5=5
10*5=50
10/5=2
10%5=0
10^5=15

3、read交互式传参

[root@LB00 Day02]# cat jisuanqi_3.sh
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
echo $num1+$num2=$[$num1+$num2]
echo $num1-$num2=$[$num1-$num2]
echo $num1*$num2=$[$num1*$num2]
echo $num1/$num2=$[$num1/$num2]
echo $num1%$num2=$[$num1%$num2]
echo $num1^$num2=$[$num1^$num2]
[root@LB00 Day02]# sh jisuanqi_3.sh
请输入第一个数字:9
请输入第二个数字:3
9+3=12
9-3=6
9*3=27
9/3=3
9%3=0
9^3=10

4、交互式传参,可以填运算符

[root@LB00 Day02]# cat jisuanqi_4.sh 
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入运算符号:" fuhao
read -p "请输入第二个数字:" num2
if [ $fuhao == "+" ]
then
  echo $num1+$num2=$[$num1+$num2]
elif [ $fuhao == "-" ]
then
  echo $num1-$num2=$[$num1-$num2]
elif [ $fuhao == "*" ]
then 
  echo $num1*$num2=$[$num1*$num2]
elif [ $fuhao == "/" ]
then
  echo $num1/$num2=$[$num1/$num2]
elif [ $fuhao == "%" ]
then
  echo $num1%$num2=$[$num1%$num2]
elif [ $fuhao == "^" ]
then
  echo $num1^$num2=$[$num1^$num2]
else
  echo 没有该运算符号
fi
[root@LB00 Day02]# sh jisuanqi_4.sh
请输入第一个数字:6
请输入运算符号:+
请输入第二个数字:1
6+1=7
[root@LB00 Day02]# sh jisuanqi_4.sh
请输入第一个数字:9
请输入运算符号:/
请输入第二个数字:3
9/3=3

5、赋值传参,可以算小数

将外面参数赋值给变量,又将变量赋值到awk里

[root@LB00 Day02]# cat jisuanqi_5.sh
#!/bin/bash
num1=$1
num2=$2
echo $num1+$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1+num2}'`
echo $num1-$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1-num2}'`
echo $num1*$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1*num2}'`
echo $num1/$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1/num2}'`
echo $num1%$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1%num2}'`
echo $num1^$num2=`awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1^num2}'`
[root@LB00 Day02]# sh jisuanqi_5.sh 10 3
10+3=13
10-3=7
10*3=30
10/3=3.33333
10%3=1
10^3=1000
 
# 其实不用两次赋值的,awk在脚本中使用方式如下
 
[root@LB00 Day02]# cat jisuanqi_6.sh 
#!/bin/bash
num1=$1
num2=$2
echo "$num1+$num2=`awk "BEGIN{print $num1+$num2}"`"
echo "$num1-$num2=`awk "BEGIN{print $num1-$num2}"`"
echo "$num1*$num2=`awk "BEGIN{print $num1*$num2}"`"
echo "$num1/$num2=`awk "BEGIN{print $num1/$num2}"`"
echo "$num1%$num2=`awk "BEGIN{print $num1%$num2}"`"
echo "$num1^$num2=`awk "BEGIN{print $num1^$num2}"`"
[root@LB00 Day02]# sh jisuanqi_6.sh 10 3
10+3=13
10-3=7
10*3=30
10/3=3.33333
10%3=1
10^3=1000

整数比较

一、比较符

-eq 相等

-ge 大于或等于

-gt 大于

-le 小于或等于

-lt 小于

-ne 不相等

二、语法

1、test 整数1 比较符 整数2

[root@LB00 ~]# test 1 -eq 1
[root@LB00 ~]# echo $?
0    #0即成立,非0不成立
[root@LB00 ~]# test 1 -ne 1
[root@LB00 ~]# echo $?
1

2、[ 整数1 比较符 整数2 ] 注意两边都有空格

[root@LB00 ~]# [ 100 -eq 100 ]
[root@LB00 ~]# echo $?
0
[root@LB00 ~]# [ 100 -lt 100 ]
[root@LB00 ~]# echo $?
1
[root@LB00 ~]# [ 100 -lt 100 ] && echo 成立 || echo 不成立
不成立
[root@LB00 ~]# [ 100 -eq 100 ] && echo 成立 || echo .成立
成立

3、表达式中都支持变量

[root@LB00 ~]# num1=100
[root@LB00 ~]# num2=100
[root@LB00 ~]# [ $num1 -eq $num2 ] && echo 成立 || echo 不成立
成立

4、表达式中都支持命令

[root@LB00 Day02]# [ `echo 100` -lt `cat /etc/passwd|wc -l ` ] && echo 成立 || echo 不成立
不成立
[root@LB00 Day02]# cat /etc/passwd|wc -l 
22

5、多整数比较

-o  or  或者

-a  and  并且

注意:在表达式 (())中使用的比较符是> < >= <= != && ||

[root@LB00 Day02]# [ 10 -eq 10 -o 100 -gt 20 ] && echo 成立 || echo 不成立
成立
[root@LB00 Day02]# [ 10 -eq 10 -o 100 -lt 20 ] && echo 成立 || echo 不成立
成立
[root@LB00 Day02]# [ 10 -ne 10 -o 100 -lt 20 ] && echo 成立 || echo 不成立
不成立
[root@LB00 Day02]# (( 10 > 2)) && echo 成立 || echo 成立
成立
[root@LB00 Day02]# (( 10 != 2 )) && echo 成立 || echo  不成立
成立
[root@LB00 Day02]# (( 10 == 2 )) && echo 成立 || echo  不成立
不成立
[root@LB00 Day02]# (( 10 == 2 || 5 > 1 )) && echo 成立 || echo 不成立
成立
[root@LB00 Day02]# (( 10 == 2 && 5 < 1 )) && echo 成立 || echo 不成立
不成立

三、示例

1、统计磁盘使用率,大于10%则告警发送邮件,小于10%则提示磁盘使用正常,当前使用率是多少

[root@LB00 Day02]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M   14M  473M   3% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        19G  2.0G   17G  11% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0
[root@LB00 Day02]# cat gaojing.sh
#!/bin/bash
#1、获取磁盘使用率
use_disk=$(df -h|grep /dev/sda3|awk '{print $5}')
 
#2、整数比较
if [ ${use_disk%\%} -gt 10 ]
then
    echo 当前的磁盘使用率:$use_disk > /tmp/disk.log
    mail -s "磁盘使用率告警通知" xxx@qq.com < /tmp/disk.log    #需要提前配置好邮箱
    i=1
else
    echo 当前磁盘使用正常,使用率为$use_disk
fi
 
sleep 60      #可以暂停60秒,查看是否恢复
 
if [ $i -eq 1 && ${use_disk%\%} -lt 10 ]
then
    echo 恢复......
fi

依照上面操作还可以写出内存使用率告警和负载使用告警

2、内存使用率告警

[root@LB00 Day02]# free  #里面used除以total乘以100%就是内存使用率
              total        used        free      shared  buff/cache   available
Mem:         995676      152768      467416       14060      375492      685652
Swap:       1048572           0     1048572
[root@LB00 Day02]# cat free.sh 
#!/bin/bash
used=`free | grep Mem | awk '{print $3}'`
total=`free | grep Mem | awk '{print $2}'`
if [ "$total" -ne "0" ]
then
  free=$((used*100/total))
else
  echo "Error: Total memory is zero."
fi
if [ ${free%\%} -gt 15 ]
then
    echo 当前内存使用率超过15%,为$free%
    exit
fi
echo 当前内存使用率正常,为$free%
[root@LB00 Day02]# sh free.sh
15
当前内存使用率正常,为15%

3、负载使用率告警

[root@LB00 Day02]# cat uptime.sh
#!/bin/bash
load1=`uptime|awk -F , '{print $(NF-2)}'|awk '{print $3}'`
load2=`uptime|awk -F , '{print $(NF-1)}'|awk '{print $1}'`
load3=`uptime|awk -F , '{print $NF}'|awk '{print $1}'`
load_avg=`awk -v load1=$load1 -v load2=$load2 -v load3=$load3 'BEGIN{print (load1+load2+load3)/3}'`
if [ $(echo "$load_avg > 0.5" | bc) -eq 1 ]
then
    echo 当前1、5、15分钟平均负载超过0.5,为$load_avg
    exit
fi
echo 当前1、5、15分钟平均负载正常为$load_avg
[root@LB00 Day02]# sh uptime.sh 
当前1、5、15分钟平均负载正常为0.02

文件判断

一、判断符

-f 文件存在则为真

-d 目录存在则为真

-e 文件存在则为真(任意类型)

-r 文件可读则为真

-w 文件可写则为真

-x 文件可执行则为真

二、语法

1、test 判断符 文件或目录

[root@LB00 Day02]# test -f /etc/passwd && echo 为真 || echo 为假
为真
[root@LB00 Day02]# test -d /etc/passwd && echo 为真 || echo 为假
为假
[root@LB00 Day02]# test -e /etc/passwd && echo 为真 || echo 为假
为真
[root@LB00 Day02]# test -r /etc/passwd && echo 为真 || echo 为假
为真
[root@LB00 Day02]# test -w /etc/passwd && echo 为真 || echo 为假
为真
[root@LB00 Day02]# test -x /etc/passwd && echo 为真 || echo 为假
为假

2、[ 判断符 文件或目录 ]

[root@LB00 Day02]# [ -f /etc/ ] && echo 为真 || echo  为假
为假
[root@LB00 Day02]# [ -d /etc/ ] && echo 为真 || echo  为假
为真
[root@LB00 Day02]# [ -e /etc/ ] && echo 为真 || echo  为假
为真
[root@LB00 Day02]# [ -r /etc/ ] && echo 为真 || echo  为假
为真
[root@LB00 Day02]# [ -w /etc/ ] && echo 为真 || echo  为假
为真
[root@LB00 Day02]# [ -x /etc/ ] && echo 为真 || echo  为假
为真

三、示例

1、目录存在则不管,不存在则创建

[root@LB00 Day02]# [ -d 10.0.0.8_2022_02_11 ] || mkdir 10.0.0.8_2022_02_11

2、目录存在则打包

[root@LB00 Day02]# [ -d /etc/ ] && mkdir /opt/`hostname`_`date +%F` && tar zcvf /opt/`hostname`_`date +%F`/etc.tar.gz /etc
[root@LB00 Day02]# tree /opt/
/opt/
└── LB00_2023-05-15
    └── etc.tar.gz

1 directory, 1 file

3、bash脚本变量在当前shell中调用

[root@LB00 Day02]# cat env.sh 
num1=100
num2=200
num3=300
[root@LB00 Day02]# [ -f env.sh ] && source env.sh && echo $num1  #夫shell调用子shell变量
100
 
[root@LB00 Day02]# cat env.sh
num1=100
num2=200
[root@LB00 Day02]# cat test.sh
#!/bin/bash
[ -f /server/scripts/Day02/env.sh ] && . /server/scripts/Day02/env.sh #不同子shell之间调用
echo $num1+$num2=$[$num1 + $num2]
[root@LB00 Day02]# sh test.sh 
100+200=300
 
[root@LB00 Day02]# cat ~/.bash_profile     #-f系统案例
# .bash_profile    
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
......

字符串比对

==、!=,也可以结合-o、-a

-z,检查字符串是否为空,字符串为空为真,-n,检查字符串是否为非空,字符串不为空为真

注意使用变量比对大部分情况下要加引号,特别是read的变量,否则直接回车不输入信息就会报错

[root@LB00 Day02]# [ root == root ] && echo 等于 || echo 不等于
等于
[root@LB00 Day02]# [ root == roo ] && echo 等于 || echo 不等于
不等于
[root@LB00 Day02]# [ root == roo -o yes == yes ] && echo 等.于 | echo 不等于
等于
[root@LB00 Day02]# [ -z "" ] && echo 字符串空 || echo 字符串非空
字符串空
[root@LB00 Day02]# [ -z "1" ] && echo 字符串空 || echo 字符串非空
字符串非空
[root@LB00 Day02]# [ -n "" ] && echo 字符串非空 || echo 字符串空
字符串空
[root@LB00 Day02]# [ -n "1" ] && echo 字符串非空 || echo 字符串空
字符串非空

正则比对

=~ 模糊匹配

[root@LB00 Day02]# [[ root =~ roo ]] && echo 匹配成功 || echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ root =~ r ]] && echo 匹配成功 || echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ root =~ ^r ]] && echo 匹配成功 || echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ root =~ ^r$ ]] && echo 匹配成功 || echo 匹配失败
匹配失败
[root@LB00 Day02]# [[ root =~ ^r.*t$ ]] && echo 匹配成 功 | echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ root =~ [a-z] ]] && echo 匹配成功 || eccho 匹配失败
匹配成功
[root@LB00 Day02]# [[ root =~ [0-9] ]] && echo 匹配成功 || echo 匹配失败
匹配失败
[root@LB00 Day02]# [[ root =~ ^[a-z]+$ ]] && echo 匹配成功 || echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ root1 =~ ^[a-z]+$ ]] && echo 匹配成功 | echo 匹配失败
匹配失败
[root@LB00 Day02]# [[ r1o2o3t =~ [0-9] ]] && echo 匹配 成功 | echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ r1o2o3t =~ [a-z]+ ]] && echo 匹.成功 || echo 匹配失败
匹配成功
[root@LB00 Day02]# [[ r1o2o3t =~ ^[a-z]+$ ]] && echo .配成功 || echo 匹配失败
匹配失败
[root@LB00 Day02]# [[ r1o2o3t =~ ^[a-z]$ ]] && echo 匹 配成功 || echo 匹配失败
匹配失败

示例一:控制输入内容格式

控制姓名年龄的格式,年龄控制在18-256之间可以正常往后运行

[root@LB00 Day02]# cat read.sh
#!/bin/bash
read -p "请输入您的姓名:" name
if [[ ! $name =~ ^[a-z]+$ ]]
then
    echo "请输入正确姓名,不能有数字"
    exit
fi
read -p "请输入您的年龄:" age
if [[ ! $age =~ ^[0-9]+$ ]]
then
    echo "请输入正确年龄,不能有英文"
    exit
fi
if ! [ $age -ge 18 -a $age -le 256 ]
then
    echo "您的年龄不符合标准"
    exit
fi
echo "姓名为" $name "年龄为" $age
[root@LB00 Day02]# sh read.sh
请输入您的姓名:q
请输入您的年龄:18
姓名为 q 年龄为 18
[root@LB00 Day02]# sh read.sh 
请输入您的姓名:q1q
请输入正确姓名,不能有数字
[root@LB00 Day02]# sh read.sh
请输入您的姓名:q
请输入您的年龄:17
您的年龄不符合标准
[root@LB00 Day02]# sh read.sh 
请输入您的姓名:qq
请输入您的年龄:333
您的年龄不符合标准

扩展(配合三剑客取系统信息)

写脚本常常需要三剑客命令的配合,所以我们进行如下练习,练习使用三剑客命令。

写一个脚本,统计出系统主机名称,eth0IP地址,公网ip地址,平台信息,系统版本号,内核版本号,磁盘使用率,内存使用率。

这种脚本可以放到/etc/profile中,xshell一连接就能看到,工作中常常需要看负载信息,这样一连接信息都出来了,比较方便。

[root@LB00 Day02]# cat tongji.sh 
#!/bin/bash
hostname=$(hostname)
eth0_ip=$(ip a|grep eth0|grep inet|awk '{print $2}')
gong_ip=$(curl -s cip.cc|awk 'NR==1{print $3}')
pingtai=$(hostnamectl|grep Virtualization|awk '{print $2}')
linux_banben=$(cat /etc/redhat-release)
linux_neihe=$(hostnamectl|grep Kernel|awk '{print $2,$3}')
load1=`uptime|awk -F , '{print $(NF-2)}'|awk '{print $3}'`
load2=`uptime|awk -F , '{print $(NF-1)}'|awk '{print $1}'`
load3=`uptime|awk -F , '{print $NF}'|awk '{print $1}'`
load_avg=`awk -v load1=$load1 -v load2=$load2 -v load3=$load3 'BEGIN{print (load1+load2+load3)/3}'`
free=$(free | grep Mem | awk '{print $3/$2 *100}')
use_disk=$(df -h|grep /dev/sda3|awk '{print $5}')
 
echo 系统主机名称为:$hostname
echo eth0的IP为:$eth0_ip
echo 公网IP为:$gong_ip
echo 平台信息为:$pingtai
echo 系统版本为:$linux_banben
echo 内核版本为:$linux_neihe
echo 1,5,15分钟平均负载为:$load_avg
echo 内存使用率为:$free%
echo 磁盘使用率为:$use_disk
[root@LB00 Day02]# sh tongji.sh 
系统主机名称为:LB00
eth0的IP为:10.0.0.4/24
公网IP为:123.112.17.24
平台信息为:vmware
系统版本为:CentOS Linux release 7.9.2009 (Core)
内核版本为:Linux 3.10.0-1160.el7.x86_64
1,5,15分钟平均负载为:0.02
内存使用率为:15.5713%
磁盘使用率为:11%
[root@LB00 Day02]# scp tongji.sh 10.0.0.7:/root/
 
[root@Web01 ~]# sh tongji.sh 
系统主机名称为:Web01
eth0的IP为:10.0.0.7/24
公网IP为:123.112.17.24
平台信息为:vmware
系统版本为:CentOS Linux release 7.9.2009 (Core)
内核版本为:Linux 3.10.0-1160.el7.x86_64
1,5,15分钟平均负载为:0.0233333
内存使用率为:50.3111%
磁盘使用率为:17%
 
[root@LB00 Day02]# tail -1 /etc/profile
sh /server/scripts/Day02/tongji.sh

2023-11-13T06:50:01.png

持续分享运维干货,感谢大家的阅读和关注!

发表评论

召唤看板娘