shell编程之if的使用
-
课程大纲:
----1、什么是if ----2、为什么要使用if
----3、if的基础语法
----单条件、双条件、多条件
----4、基于文件进行判断
----5、基于整数进行判断
----6、基于字符进行判断
----7、基于正则进行判断
----8、基于逻辑或 && || -a -o
if仅仅是用来判断的,基于条件进行判断。 整数、字符、正则 。。。。。。
1、if的基础语法(单分支、双分支、多分支)
单分支
if [你有房];then [ -f file ] && echo ok
if [你有房]
then
我就嫁给你
fi
双分支
if [ 你有房 ] [ -f file ] && echo ok || echo error
then
我就嫁给你
else
拜拜
fi
多分支
if [ 你有房 ]
then
我就嫁给你
elif [ 你有钱 ]
then
我也嫁给你
elif [ 你爸是李刚 ]
then
我也嫁给你
elif [ 活好!运维技术好 ]
then
我倒贴也嫁给你
elif [ 你在老男孩学运维 ]
then
我考虑考虑
else
拜拜
fi
- 条件表达式[ -X XX ] (特别注意空格首位必须加)
[]======test []常用
[ -f file ] 文件是否存在 且为普通文件 重点
[ -e file ] 文件存在则为真
[ -d file ] 目录存在则为真 重点
[ -x file ] 文件有执行权限则为真
[ -w file ] 文件可写则为真
[ -r file ] 文件可读则为真
[ -s file ] 文件空则为真
[root@web01 scripts]# [ -f /etc/hosts ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -f /etc/hostsss ] && echo 为真 || echo 为假
为假
[root@web01 scripts]# [ -d /etc/hosts ] && echo 为真 || echo 为假
为假
[root@web01 scripts]# [ ! -d /etc/hosts ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -e /etc/hosts ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -e /etc/ ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -r /etc/ ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -w /etc/ ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -x /etc/ ] && echo 为真 || echo 为假
为真
[root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
[root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
为假
[root@web01 scripts]# [ -x /etc/hosts ] && echo 为真 || echo 为假
为假
- -d 判断是否为目录 目录是否存在
[root@web01 scripts]# [ -d /alex ] || mkdir /alex
[root@web01 scripts]# test -f /etc/hosts && echo ok || echo error
ok
[root@web01 scripts]# test -d /etc/hosts && echo ok || echo error
error
[root@web01 scripts]# test -d /etc/ && echo ok || echo error
ok
2、数值的比较
[ 数值1 比较符 数值2 ] [[]] = != >= < <=
-eq 相等
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
例如:
[root@manager ~]# [ 10 -eq 10 ] && echo ok || echo error
ok
案例演示:
案例一:##################
统计当前磁盘的使用率,如果大于5%,则把内容写到以日期为名称的文本中
2019-10-29-01.txt 如果小了,则把当前的使用率写入 2019-10-29-01.txt
思考:1、如何取出当前的使用率:
[root@manager ~]# df -h |awk 'NR==2{print $(NF -1)}'
7%
2、函数的比较
3、输出结果到文本
4、调试
[root@manager if]# cat var07.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var07.sh
time=$(date +%F)
disk_usr=$(df -h | awk 'NR==2{print $(NF-1)}')
if
[ ${disk_usr%\%} -gt 5 ];then
echo "当前使用率过高 ${disk_usr}" >> ${time}.txt || echo "当前使用率正常 $disk_usr" >> ${time}.txt
fi
案例2、统计系统内存的使用率 如果大于10则 echo 使用率到 以时间命名的文件中
1.如何取出当前的使用率
百分比=====使用的除总数乘100
2.条件表达式 整数的比较
3.输出结果到文本
4.调试
[root@manager if]# free |awk 'NR==2 {print $3/$2*100}'
19.7499
案例3、根据输入一个用户名称、
1、判断输入的用户是否存在当前系统
2、如果不在当前系统,再次判断用户是否在、home下拥有家目录
3、如果没有则提示不存在
###第一种写法
[root@manager if]# cat var11.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var11.sh
if grep $1 /etc/passwd &> /dev/null;then
echo "$1 用户存在系统中......"
elif ls -ld /home/$1 &>/dev/null;then
echo "用户不存在系统中,但是拥有家目录......"
else
echo "用户不存在系统,也不拥有家目录......"
fi
[root@manager if]# bash var11.sh oldboy
用户不存在系统,也没有家目录......
[root@manager if]# bash var11.sh test123
test123 用户存在系统中......
[root@manager if]#
###第二种写法
grep_user=$(grep $1 /etc/passwd &>/dev/null)
grep_rc=$?
cat_home=$(ls -ld /home/$1 &>/dev/null)
cat_rc=$?
if [ $grep_rc -eq 0 ];then
echo "$1 用户存在系统中...."
elif [ $cat_rc -eq 0 ];then
echo "$1 用户不存在系统中,但拥有家目录"
else
echo "$1 用户不存在系统,也没有家目录"
fi
需求2:通过脚本传入两个参数,进行整数关系比较。
比如: if.sh [ 1 2 | 2 2 | 2 3 ],请使用双分支和多分支两种方式实现。
#######--------双分支:
[root@manager if]# cat var13.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var13.sh
if [ $1 -eq $2 ];then
echo "$1 = $2"
elif [ $1 -lt $2 ];then
echo "$1 < $2"
else
echo "$1 > $2"
fi
[root@manager if]# bash var13.sh 1 5
1 < 5
[root@manager if]# bash var13.sh 34 22
34 > 22
######多分支-----
[root@manager if]# cat var14.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var14.sh
if [ $1 -eq $2 ];then
echo "$1 = $2"
else
if [ $1 -gt $2 ];then
echo "$1 > $2"
else
echo "$1 < $2"
fi
fi
[root@manager if]# bash var14.sh 5 9
5 < 9
基于文件的条件比对案例实现
需求1:备份mysql,手动输入你需要备份的库名称,备份到/backup/mysql/时间/xx.sql
思考:数据库怎么备份?
如何将手动命令转化为脚本?
mysqldump -uroot -poldxu.com -B mysql > /backup/mysql/2019-10-29/mysql.sql
[root@manager if]# cat var15.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var15.sh
#1、文件所保存的路径
Date=$(date +%F)
Path="/backup/mysql/$Date"
#2、判断保存的目录是否存在
[ -d $Path ] || mkdir -p $Path
#3、给用户展示当前有哪些数据库
mysql -uroot -poldxu.com -e "show databases;"
read -p "请输入你需要备份的数据库名:" dbname
#4、执行备份命令
mysqldump -uroot -poldxu.com -B ${dbname} > $Path/${dbname}.sql
[root@manager if]# bash var15.sh
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
请输入你需要备份的数据库名:test
[root@manager if]# cd /backup/mysql/
[root@manager mysql]# ls
2019-10-29
整数对比
需求1:用户执行脚本,bash var16.sh nginx,则检查nginx服务的运行状态。(仅支持传递一个参数)
1.检查nginx状态 systemctl status nginx
2.状态结果非0 则提示未启动
3.状态结果为0 则提示已启动
[root@manager mysql]# cat var16.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var16.sh
if [ $# -ne 1 ];then
echo "USAGE: $0 {nginx | rsyncd |mariadb }"
exit
fi
systemctl status $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 已经启动"
else
echo "$1 未启动"
fi
[root@manager mysql]# bash var16.sh nginx
nginx 已经启动
需求2:查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
[root@manager if]# cat var17.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var17.sh
disk_use=$(df -h |awk '/\/$/ {print $(NF-1)}')
if [ ${disk_use%\%} -ge 5 ];then
echo "邮件报警中......"
sleep 3
echo "邮件已经发送完毕,你的磁盘使用率是$disk_use"
fi
[root@manager if]# bash var17.sh
邮件报警中......
邮件已经发送完毕,你的磁盘使用率是7%
需求:单分支,判断当前用户是不是root,如果不是那么返回“ERROR”
[root@manager if]# cat var18.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var18.sh
#1、通过整数比对的方式实现,注意,这里需要创建普通用户来实现
if [ $UID -ne 0 ];then
echo "ERROR"
exit
fi
#2、通过字符串的比对方式---->这是第二章方式
if [ $USER != "root" ];then
echo "ERRO"
exit
fi
需求2:双分支,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“
[root@manager if]# cat var19.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var19.sh
if [ $UID -eq 0 ];then
echo "hey admin"
else
echo "hey quest"
fi
[root@manager if]# bash var19.sh
hey admin
需求1:
备份filename文件至/backup/system/filename-2019-10-29,如果该目录不存在则自动创建。
[root@manager if]# cat var20.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var20.sh
Dest=/backup/system
Date=$(date +%F)
read -p "请输入备份源: " Src
if [ ! -d $Dest ];then
mkdir $Dest
fi
cp -rpv $Src $Dest/filename-$Date
[root@manager if]# bash var20.sh
请输入备份源: /etc/hosts
‘/etc/hosts’ -> ‘/backup/system/filename-2019-10-29/hosts’
- 需求2:继需求1,判断备份的文件是否存在,如果不存在则提示”No such file or directory“,然后退出。
[root@manager if]# cat var21.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var21.sh
Dest=/backup/system
Date=$(date +%F)
read -p "请输入备份源: " Src
#1.判断用户输入的路径是否存在,是否是一个文件
if [ ! -f $Src ];then
echo "$Src No such file or directory"
exit
fi
if [ ! -d $Dest ];then
mkdir $Dest
fi
cp -rpv $Src $Dest/filename-$Date
- 需求3:继需求1、2,判断备份的文件是否为空,如果为空则提示"This is file empty",然后退出。
Dest=/backup/system
Date=$(date +%F)
read -p "请输入备份源: " Src
#1.判断用户输入的路径是否存在,是否是一个文件
if [ ! -f $Src ];then
echo "$Src No such file or directory"
exit
fi
#2.判断文件为空,则报错
if [ ! -s $Src ];then
echo "$Src This is file empty"
exit
fi
#3.备份源没有问题,则创建备份的目录
if [ ! -d $Dest ];then
mkdir $Dest
fi
cp -rpv $Src $Dest/filename-$Date
需求1:提示学生输入自己的成绩。
1.如果分数大于0小于59提示补考。
2.如果分数大于60小于70提示良好。
3.如果分数大于71小于85提示好。
4.如果分数大于86小于100提示优秀。
5.不允许输入空值.
6.必须输入的是全数字
[root@manager if]# cat var22.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var22.sh
read -p "请输入你的成绩分数: " cj
if [ -z $cj ];then
echo "....."
exit 1
fi
#除了数字0-9以外的,其他都匹配
if [[ ! "$cj" =~ ^[0-9]+$ ]];then
echo "请输入纯数字"
exit 2
fi
if [ $cj -ge 0 -a $cj -le 59 ];then
echo "补考..."
elif [ $cj -ge 60 -a $cj -le 70 ];then
echo "不错..."
elif [ $cj -ge 71 -a $cj -le 85 ];then
echo "good"
elif [ $cj -ge 86 -a $cj -le 100 ];then
echo "very good!"
else
echo "gdx"
fi
[root@manager if]# bash var22.sh
请输入你的成绩分数: 87
very good!
需求2:使用for循环打印一推单词,然后仅输出以r开头的单词。
[root@manager if]# cat var23.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var23.sh
for var in ab ac rx bx rvv vt
do
if [[ "$var" =~ ^r ]];then
echo $var
fi
done
[root@manager if]# bash var23.sh
rx
rvv
需求3:编写一个创建用户的脚本。
思路:
1.提示用户输入要创建用户的前缀,必须是英文。 oldboy
2.提示用户输入后缀,必须是数字。 123
3.如果前缀和后缀都没有问题,则进行用户创建。
[root@manager if]# cat var24.sh
#!/bin/bash
#********************************************************************
#Author: 一个shell小白
#QQ: 2226823216
#Date: 2019-10-29
#FileName: var24.sh
read -p "请输入用户的前缀: " qz
#判断用户输入的前缀
if [[ ! $qz =~ ^[a-Z]+$ ]];then
echo "你输入的不是纯英文....."
exit 1
fi
read -p "请输入用户的后缀: " hz
#判断用户输入的后缀
if [[ ! $hz =~ ^[0-9]+$ ]];then
echo "你输入的不是纯数字...."
exit 2
fi
#开始拼接用户输入的前缀+后缀=user_name变量
user_name=$qz$hz
id $user_name &>/dev/null
if [ $? -eq 0 ];then
echo "用户已经存在"
exit 3
else
useradd $user_name
echo "$user_name 用户创建成功"
fi
[root@manager if]# bash var24.sh
请输入用户的前缀: old
请输入用户的后缀: 1
old1 用户创建成功
[root@manager if]# bash var24.sh
请输入用户的前缀: oldboy
请输入用户的后缀: 123
oldboy123 用户创建成功
技术是没有终点的,也是学不完的,最重要的是活着、不秃。 学习看书还是看视频,都不重要,重要的是学会,欢迎关注,我们的目标---不秃。
---更多运维开发交流及软件包免费获取请加V: Linuxlaowang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义