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