基本流程控制方法:
- if语句
- case语句
- for循环
- while循环
一、if语句
1、单分支if条件语句
if [ 条件判断式 ] ; then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点:
- if语句使用fi结尾,和一般语言使用大括号结尾不同;
- [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格;
- then后面跟符合条件之后执行的程序,可以放在[ ]之后,用“ ; ” 分割。也可以换行写入,就不需要 “ ; ” 了
示例:判断分区使用率
[root@root 桌面]# cd ~
[root@root ~]# mkdir sh
[root@root ~]# cd sh/
[root@root sh]# vim if1.sh
#具体文本如下:
#!/bin/bash
#这句话标称,我写的一下语句是Linux的shell脚本,这句话在Linux的shell脚本中是不可以省略的,必须写。
#若我们写的所有内容都是shell语言,这句话可以省略,但是如果是比较复杂的shell脚本(即里面嵌套其他语言时,这个必须写,否则会出错!)
#统计根分区使用率
# Author:shenchao
rate=$(df -h | grep "/dev/sda2" | awk '{printf $5}' | cut -d "%" -f1)
#把根分区使用率作为变量值赋予变量rate。其中/dev/sda2分区文件与自己的匹配
if [ $rate -ge 5 ]
then
echo "warning /dev/sda3 is full!!!"
fi
#执行如下:
[root@root sh]# chmod 755 if1.sh
[root@root sh]# ./if1.sh
warning /dev/sda3 is full!!!
2、双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
- 示例1:备份mysql数据库
#!/bin/bash
#备份mysql数据库
date=$(date +%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /etc)
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d /tmp/dbback ]
then
echo "Date is : $date" > /tmp/dbback/db.txt
echo "size is : $size" >> /tmp/dbback/db.txt
cd /tmp/dbback
tar -zcf etc_$date.tar.gz /etc db.txt &>/dev/null
rm -rf /tmp/dbback/db.txt
else
mkdir /tmp/dbback
echo "Date is : $date" > /tmp/dbback/db.txt
echo "size is : $size" >> /tmp/dbback/db.txt
cd /tmp/dbback
tar -zcf etc_$date.tar.gz /etc db.txt &>/dev/null
rm -rf /tmp/dbback/db.txt
fi
#执行这个脚本:
[root@root sh]# chmod 755 if2.sh
[root@root sh]# ./if2.sh
#第一执行if语句,第二次执行else语句
[root@root sh]# cd /tmp/
[root@root tmp]# ls
_cafenv-appconfig_ keyring-ll26zc pulse-h68wANV588jC virtual-root.ixLqJB
dbback orbit-gdm pulse-HYwFHd4subTQ vmware-root
keyring-CfdIfM orbit-root stu.txt vmware-root_1588-868458577
[root@root tmp]# cd dbback/
[root@root dbback]# ls
etc_190716.tar.gz
[root@root dbback]# tar -ztvf etc_190716.tar.gz
#查看一下这个目录下的内容
- 示例2:判断apache是否启动
这个脚本我们只需要让系统没15 分钟执行一次,这样我们第二天只要看错误日志,就可以知道,在我们这一天的时间里面apache死机了多少次。这就是一个自动重启apache的脚本。
[root@root sh]# vi if3.sh
#!/bin/bash
#Author:shenchao
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令扫描服务器,并截取Apache服务状态,赋予变量port
if [ "$port"=="open" ]
#比较port的值是否为“open”,比较两个字符串是否相等用的是“==”号
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
#如果相等,说明apache服务启动,不做任何事情,只需要记录一条当前时间系统正常到日志
else
/etc/rc.d/init.d/httpd start &>/dev/null
#如果不相等,启动apache,并将输出结果丢到垃圾箱
echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
#同时记录,我们在这个时间重启apache,并将其记录在错误日志
fi
#运行程序
[root@root sh]# chmod 755 if3.sh
[root@root sh]# ./if3.sh
[root@root sh]# ./if3.sh
[root@root sh]# cd /tmp/
[root@root tmp]# ls
... ...
[root@root sh]# cat httpd_err.log
[root@root sh]# netstat -tlun
3、多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
… 省略更多条件 …
else
当所有条件都不成立时,最后执行此程序
fi
示例如下:
#!/bin/bash
#判断用户输入的是扫描文件
read -p "Please input a filename:" file
#接收键盘的输入,并赋予变量file
if [ -z "$file" ]
#判断file变量是否为空
then
echo "Error,please input a filename!"
exit 1
elif [ ! -e "file" ]
#判断file的值是否存在
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ]
#判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ]
#判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
二、case语句
- case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
- case语句更适合于选择列表语句;
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
其中,;;两个分号代表程序段的结束,这两个分号不能省略。
- 示例说明1:输入一个选项,请选择yes或no
[root@root sh]# vi case.sh
#!/bin/bash
read -p "Please choose yes/no:" -t 30 cho
# -t 30 ——> 等待30 秒
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is no!"
;;
esac
[root@root sh]# chmod 755 case.sh
[root@root sh]# ./case.sh
Please choose yes/no:yes
Your choose is yes!
[root@root sh]# ./case.sh
Please choose yes/no:no
Your choose is no!
- 示例说明2:出行地选择
[root@root sh]# vi case1.sh
!/bin/bash
echo 'you want to shanghai! Please input "1"'
echo 'you want to guangzhou! Please input "2"'
echo 'you want to chengdu! Please input "3"'
read -t 30 -p "Please input your choose:" cho
case "$cho" in
"1")
echo "shanghai!!!!"
;;
"2")
echo "guangzhou!!!!"
;;
"3")
echo "chengdu!!!!"
;;
"*")
echo "shanghai!!!!"
;;
esac
#运行结果如下:
[root@root sh]# chmod 755 case1.sh
[root@root sh]# ./case1.sh
[root@root sh]# ./case1.sh
you want to shanghai! Please input "1"
you want to guangzhou! Please input "2"
you want to chengdu! Please input "3"
Please input your choose:1
shanghai!!!!
[root@root sh]# ./case1.sh
you want to shanghai! Please input "1"
you want to guangzhou! Please input "2"
you want to chengdu! Please input "3"
Please input your choose:2
guangzhou!!!!