shell流程控制

目录

  • 1.if条件判断
  • 2.多分支case条件语句

1.if条件判断

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

2.多分支case条件语句

case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系
case语句语法如下:


case $变量名 in
	"值1")
	如果变量的值等于值1,则执行程序1
	;;
	"值2")
	如果变量的值等于值2,则执行程序2
	::
	…省略其他分支…
	*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac

这个语句需要注意以下内容:

  • case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则依次比较下一个值。如果所有的值都不符合,则执行 “*)” (*代表所有其他值)中的程序。
  • case语句以“case”开头,以“esac”结尾。
  • 每一个分支程序之后要通过“;;”双分号结尾,代表该程序段结束(千万不要忘记,每次写case语句,都不要忘记双分号)。

案例:

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确认:#
您输入的是其他字符

你可能感兴趣的:(shell,linux,shell)