1.1单分支if条件
语法:
if [ 条件判断式 ]
then
程序
fi
案例:统计根分区使用率
vi test1.sh
#!/bin/bash
#统计根分区的使用率
#cut 从一行上一处部分内容,选择性显示
rate=$(df -h | grep "/dev/vda1" | awk '{print $5}' | cut -d "%" -f1)
if [ $rate -ge 80 ]
#判断rate的值如果大于80,则执行then程序
then
echo "warning! /dev/vda1 is full"
#打印警告信息
fi
案例:创建目录
vim test2.sh
#!/bin/bash
#创建目录。判断是否存在,存在就结束,反之创建
echo "当前脚本名称为$0"
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
echo "$DIR创建完成"
else
echo "$DIR已经存在"
fi
#执行脚本
[root@tdm1 ~]# bash test3.sh
当前脚本名称为test3.sh
/media/cdrom创建完成
1.2双分支if条件语句
语法:
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
案例:备份数据库
#!/bin/bash
#备份mysql数据库
#同步系统时间
ntpdate asia.pool.ntp.org >> /dev/null 2>&1
#把当前时间按照年月日格式赋值变量
date=$(date +%y%m%d)
#统计mysql数据库大小,赋值size变量
size=$(du -sh /usr/local/mysql)
if [ -d /tmp/mysql ]
#判断备份目录是否存在,是否为目录
then
#把当前日期写入临时文件
echo "Date:$date" > /tmp/mysql/dbinfo.txt
#把当前数据库大小写入临时文件
echo "Data size:$size" >> /tmp/mysql/dbinfo.txt
#进入该目录下
cd /tmp/mysql
#打包压缩数据库和临时文件,把产生的输出丢入垃圾箱
tar -zcf mysql-lib-$date.tar.gz /usr/local/mysql dbinfo.txt >>/dev/dull 2>&1
#删除临时文件
rm -rf /tmp/mysql/dbinfo.txt
else
#如果判断为假,则建立备份目录
#创建目录
mkdir /tmp/mysql
#把当前日期写入临时文件
echo "Date:$date" > /tmp/mysql/dbinfo.txt
#把当前数据库大小写入临时文件
echo "Data size:$size" >> /tmp/mysql/dbinfo.txt
#进入该目录下
cd /tmp/mysql
#打包压缩数据库和临时文件,把产生的输出丢入垃圾箱
tar -zcf mysql-lib-$date.tar.gz /usr/local/mysql dbinfo.txt >>/dev/dull 2>&1
#删除临时文件
rm -rf /tmp/mysql/dbinfo.txt
fi
##执行脚本
[root@tdm1 ~]# ./test4.sh
[root@ltdm1 mysql]# pwd
/tmp/mysql
[root@tdm1 mysql]# ll
total 712592
-rw-r--r--. 1 root root 729693306 Sep 13 01:49 mysql-lib-230913.tar.gz #备份成功,并且删掉dbinfo.txt文件
案例:判断apache是否启动,如果没有则启动
vim test5.sh
#!/bin/bash
#判断httpd是否启动,没有启动就开启
#统计httpd进程的个数
count=$(ps -ef | grep httpd | grep -v grep | wc -l)
#判断进程是否大于0
if [ $count -gt 0 ]
then
#大于0,进程启动
echo "httpd进程启动"
else
#启动httpd进程
systemctl start httpd
fi
##执行脚本
[root@tdm2 ~]# ps -ef | grep httpd
root 13476 1 1 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 13477 13476 0 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 13478 13476 0 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 13479 13476 0 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 13480 13476 0 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 13481 13476 0 14:04 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 13574 17106 0 14:04 pts/1 00:00:00 grep --color=auto httpd
[root@tdm2 ~]# ./test5.sh
httpd进程启动
1.3多分支if条件语句
语法:
vim test6.sh
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
…省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
案例:判断用户输入的是什么文件
#判断用户输入的是什么文件
read -p "Please input a filename: " file
#接收键盘的输入,并赋予变量file
if [ -z "$file" ]
#判断file变量是否为空
then
echo "Error, please input a filename"
#如果为空,执行程序1,也就是输出报错信息
exit 1
#退出程序,并返回值为Ⅰ(把返回值赋予变量$P)
elif [ ! -e "$file" ]
#判断file的值是否存在
then
echo "Your input is not a file!"
#如1果不存在,则执行程序2
exit 2
#退出程序,把并定义返回值为2
elif [ -f "$file" ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!"
#如果是普通文件,则执行程序3
elif [ -d "$file" ]
#到断file的值是否为目录文件
then
echo "$file is a directory!"
#如果是目录文件,网执行程序4
else
echo "$file is an other file!"
#如果以上判断都不是,则执行程序5
fi
##执行脚本
[root@tdm1 ~]# bash test6.sh
Please input a filename: abc
Your input is not a file!
[root@tdm1 ~]# bash test6.sh
Please input a filename: /etc
/etc is a directory!
[root@tdm1 ~]# bash test6.sh
Please input a filename: test.sh
test.sh is a regulare file!
[root@tdm1 ~]# bash test6.sh
Please input a filename:
Error, please input a filename
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系
case语句语法如下:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
::
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
这个语句需要注意以下内容:
案例:
vim test7.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是字母"
;;
[0-9])
echo "您输入的是数字"
;;
*)
echo "您输入的是其他字符"
;;
esac
##执行脚本
[root@tdm1 ~]# bash test7.sh
请输入一个字符,并按Enter确认:a
您输入的是字母
[root@tdm1 ~]# bash test7.sh
请输入一个字符,并按Enter确认:1
您输入的是数字
[root@tdm1 ~]# bash test7.sh
请输入一个字符,并按Enter确认:#
您输入的是其他字符