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 用户创建成功
posted @   老王教你学Linux  阅读(401)  评论(0编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示