四个示例教会你Shell中的if、then、elif、else——流程控制语句
流程控制——if1. 单分支if条件语句语法:if [ 条件判断式 ];then程序fi或者if [ 条件判断式 ]then程序fi注意事项:if语句使用fi结尾,和一般语言使用大括号结尾不同[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格。then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了。示例1:统计根分区使用
流程控制——if
1. 单分支if条件语句
语法:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意事项:
- if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]
就是使用test命令判断,所以中括号和条件判断式之间必须有空格。- then后面跟符合条件之后执行的程序,可以放在[]之后,用“
;
”分割。也可以换行写入,就不需要“;
”了。
示例1:统计根分区使用率
制作一个脚本,用来统计根分区的使用率。
我们先给出全部的代码,然后来一步步分解:
#!/bin/bash
# 统计根分区的使用率
# Author:Veeja.Liu
rate=$(df -h | grep "dev/vda1" | awk '{print $5}' | cut -d "%" -f1)
# 把根分区使用率作为变量赋予变量rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/vda1 is full!!"
fi
首先是df命令,这个命令可以查看分区的使用率,例如:
我们可以看到我们的挂载点为根分区的对应文件系统为/dev/vda1
,接下来使用命令grep筛选出这一行:
然后我们看到我们想要的13在第五列,再使用awk把第五列提取出来:
我们现在得到的12%
,我们现在想要的是12这个数字,接下来:使用cut命令
,使用-d
参数指定%
为分隔符,然后使用-f
参数提取第一列:
我们最后把这个值赋给了变量rate:
rate=$(df -h | grep "dev/vda1" | awk '{print $5}' | cut -d "%" -f1)
然后我们使用条件表达式 [ $rate -ge 80 ]
判断rate的值是否大于80,如果大于80,就在屏幕上输出一句话:“Warning! /dev/vda1 is full!!”。
2. 双分支if条件语句
语法:
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
示例2 备份mysql数据库
#!/bin/bash
#备份MySQL数据库
#Author:Veeja.LIU
ntpdate asia.pool.ntp.org &>/dev/null
#同步系统时间
date=$(date +%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /var/lib/mysql)
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d /tmp/dbbak ]
then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
示例3 判断Apache是否启动
#!/bin/bash
#Author:Veeja.LIU
port=$(nmap -sT 127.0.0.1 | grep http | grep tcp | awk '{print $2}' )
#使用nmap命令扫描服务器,并且截取Apache服务的状态,赋予变量port
if [ "$port" == "open" ]
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &> /dev.null
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi
nmap
是一个远程扫描端口的程序,例如我们可以测试一下我的本地的ip地址:
然后我们把带有“tcp”和“http”的行列出来,取第二个字段的值,如果是open,就代表Apache服务已经启动了。
3. 多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立的时候,最后执行此程序
fi
示例4 判断用户输入的是什么文件
#!/bin/bash
#判断用户输入的是什么文件
#Author:Veeja.LIU
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)