Shell编程之流程控制语句——if语句、case语句
2019-07-16 17:45
661 查看
基本流程控制方法:
- 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!!!!
相关文章推荐
- shell-6-退出状态与流程控制语句(if;test;case命令)
- shell流程控制中的if和case介绍
- sql控制流程语句case when/if/ifnull/null if
- 70个shell常用操作、 shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select
- Shell| 流程控制语句(if)和判断逻辑的几种写法(是否省略test)
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- shell脚本中if流程控制语句的应用
- shell脚本之-if流程控制语句和for循环语句的使用
- 3、shellwhile循环,C-for循环,until循环,case分支结构,流程控制语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- 学习笔记 shell流程控制语句 while条件循环语句和case条件测试语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- Linux学习之Shell--第三天:Shell流程控制-if语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- Shell编程-流程控制-if、case语句
- shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select .
- Linux学习之道:linux中流程控制语句if if else case