威尼斯wns.9778官网活动_vnsc威尼斯城官网

热门关键词: 威尼斯wns.9778官网活动,vnsc威尼斯城官网
当前位置:威尼斯wns.9778官网活动 > 计算机教程 > 【威尼斯wns.9778官网活动】详解Shell编程之if语句

【威尼斯wns.9778官网活动】详解Shell编程之if语句

文章作者:计算机教程 上传时间:2019-05-10

对于if语句,其实很多人都肯定的听说过,那么if语句到底是什么,简单的说,就类似于汉语里面的如果----那么,if语句是linux运维人员在实际环境中使用的最频繁也是最重要的语句!!!

阅读目录

一、if条件语句

1、单分支语句结构

回到顶部

第一种语法如下:

1.1 条件表达式

if <条件表达式> 
 then 
 指令 
fi 

1.1.1 文件判断

常用文件测试操作符

常用文件测试操作符

说明

-d文件,d的全拼为directory

文件存在且为目录则为真,即测试表达式成立

-f文件,f的全拼为file

文件存在且为普通文件则为真,即测试表达式成立

-e文件,e的全拼为exist

文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件

-r文件,r的全拼为read

文件存在且可读则为真,即测试表达式成立

-s文件,s的全拼为size

文件存在且文件大小不为0则为真,即测试表达式成立

-w文件,w的全拼为write

文件存在且可写则为真,即测试表达式成立

-x文件,x的全拼为executable   

文件存在且可执行则为真,即测试表达式成立

-L文件,L的全拼为link

文件存在且为链接文件则为真,即测试表达式成立

fl -nt f2,nt 的全拼为 newer than

文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算

fl -ot f2,ot 的全拼为 older than

文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算

判断文件是否存在

[root@clsn scripts]# [ -f /etc/hosts ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ -f /etc/hosts1 ]
[root@clsn scripts]# echo $?
1

判断文件是否存在,返回方式

[root@clsn scripts]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在" 
文件存在
[root@clsn scripts]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在" 
文件不存在

判断目录是否存在

[root@clsn scripts]# [ -d /tmp ] && echo "目录存在" || echo "目录不存在" 
目录存在
[root@clsn scripts]# [ -d /tmp1 ] && echo "目录存在" || echo "目录不存在" 
目录不存在

使用变量的方法进行判断

dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在"

第二种语法

1.1.2 字符串判断

字符串测试操作符 

常用字符串测试操作符

说明

-n "字符串"

若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero

-Z "字符串"

若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写

"串 1"== "串 2"

若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"="

"串 1" != "串 2"        

若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="

1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。

2.空格非空

-z 判断字符串长度

[root@clsn scripts]# x=  ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入为空
[root@clsn scripts]# x=12 ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入有内容

*-n 判断字符串长度***

[root@clsn scripts]# x=12 ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入有内容
[root@clsn scripts]# x= ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入为空

*"串 1" == " 串 2 "       **使用定义变量的方式进行判断*

cmd=$1
[ "$cmd" == "start" ] && echo start
# 测试
[root@clsn scripts]# cmd=start;[ "$cmd" == "start" ] && echo start
start
if <条件表达式>; then 
 指令 
fi 

1.1.3 整数判断

整数二元比较操作符参考

在[]以及test中

使用的比较符号

在(())和[[]]中

使用的比较符号

说明

-eq

==或=

相等,全拼为equal

-ne

!=

不相等,全拼为not equal

-gt

大于,全拼为greater than

-ge

>=

大于等于,全拼为greater equal

-lt

小于,全拼为丨ess than

-le

<=

小于等于,全拼为less equal

判断两数是否相等

[root@clsn scripts]# [ 1 -eq 1 ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ 1 -eq 2 ]
[root@clsn scripts]# echo $?
1

大于等于

[root@clsn ~]# [ 11 -ge 1 ] && echo "成立" || echo "不成立"
成立

小于

[root@clsn ~]# [ 11 -lt 1 ] && echo "成立" || echo "不成立"
不成立

大于

[root@clsn ~]# [ 11 -gt 1 ] && echo "成立" || echo "不成立"
成立

不等于

[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立

在以上这两种方式中我还是喜欢用第一种,这个是看个人习惯的。在上面的两个语法中<条件表达式>可以是 test [] [[]] (())等条件表达式,甚至可以使用命令作为条件表达式。注意:每个if语句都是以if开头 fi结束,中间并带有then;

1.1.4 逻辑符号

常用逻辑操作符 

在[]和test中使用的操作符

说明

在[[]]和中使用的操作符

说明

-a

[ 条件A -a  条件B ]

A与B都要成立,整个表达式才成立

&&

and,与,两端都为真,则结果为真

-o

[ 条件A -o  条件B]

A与B都不成立,整个表达式才不成立

||

or,或,两端有一个为真,则结果为真

 

!

not,非,两端相反,则结果为真

逻辑操作符与整数判断配合

[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立

 取反

[root@clsn ~]# [ ! 11 -ne 1 ] && echo "成立" || echo "不成立"
不成立

两边都为真

[root@clsn ~]# [  11 -ne 1 -a 1 -eq 1 ] && echo "成立" || echo "不成立"
成立

至少有一边为真

[root@clsn ~]# [  11 -ne 1 -o 1 -eq 1 ] && echo "成立" || echo "不成立"
成立

感叹号的特殊用法

         *使用历史命令,感叹号加上history中的序号,即可执行*

[root@clsn ~]#  !516
 ls
anaconda-ks.cfg  bootime.avg  setup.sh  vim

其实很简单,举个例子如下:

1.1.5 【练习题】开发3个shell脚本比较2个整数大小

要求:

1. 分别以定义变量,脚本传参以及read读入的方式写3个脚本。

2. 用条件表达式(禁止if语句)进行判断。

3. 将2个整数的比较结果输出到屏幕,出错需要提示。

使用定义变量方法

 

[root@clsn panduan1]# cat panduan1.sh 
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

NUM1=6
NUM2=2

expr 1   $NUM1  &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " &&  exit 2
expr 1   $NUM2 &>/dev/null
[ $? -eq 2 ] && echo "$NUM2 不是整数 " &&  exit 2

[ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2  && exit
[ "$NUM1" -gt "$NUM2" ] && echo $NUM1 > $NUM2 && exit
[ "$NUM1" -lt "$NUM2" ] && echo $NUM1 < $NUM2

 

使用传参方法

 

[root@clsn panduan1]# cat panduan_chuanchan.sh 
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################
[ $# -ne 2 ] && echo "UASGE $0 num1 num2 " && exit

NUM1=$1
NUM2=$2

expr 1   $NUM1  &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " &&  exit 2
expr 1   $NUM2  &>/dev/null
[ $? -eq 2 ] && echo "$NUM2 不是整数 " &&  exit 2

[ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2  && exit
[ "$NUM1" -gt "$NUM2" ] && echo $NUM1 > $NUM2 && exit
[ "$NUM1" -lt "$NUM2" ] && echo $NUM1 < $NUM2

 

*使用read读入***

 

[root@clsn panduan1]# cat panduan_read.sh 
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
read -p "请输入第二个整数:" NUM2

expr 1   $NUM1  &>/dev/null
[ $? -eq 2 ] && echo "$NUM1 不是整数 " &&  exit 2
expr 1   $NUM2  &>/dev/null 
[ $? -eq 2 ] && echo "$NUM2 不是整数 " &&  exit 2

[ "$NUM1" -eq "$NUM2" ] && echo "$NUM1 = $NUM2"  && exit
[ "$NUM1" -gt "$NUM2" ] && echo "$NUM1 > $NUM2" && exit
echo "$NUM1 < $NUM2"

 

回到顶部

if [ -f file ] 
 then 
 echo "是一个普通文件" 
 else 
 echo "不是一个普通文件" 
 exit 1 
fi 

1.2 if条件语句

  # 条件表达式和if语句可以互相转换

剖析:如果file是一个普通文件,那么就执行echo "是一个普通文件"  否则 输出一条"不是一个普通文件" 最后退出脚本

1.2.1 三种语法

单分支语句

 

if [ -f /etc/hosts ]

then

    echo '文件存在'

fi

 

双分支语句

 

if [ -f /etc/hosts ]  

then

   echo "文件存在"

else

echo "文件不存在"

   echo "..." >>/tmp/test.log

fi

 

多分支语句

 

if [ -f /etc/hosts ]  

then

   echo " hosts文件存在"

elif [ -f /etc/host ]

then

   echo " host文件存在"

fi

 

其实以下的这段命令更能清晰的了解if语句如下:

1.2.2 if条件语句小结

  单分支:一个条件一个结果

  双分支:一个条件两个结果

  多分支:多个条件多个结果

如果 <你不会if语句> 
 那么 
 那肯定长的不帅 
果如 

1.2.3 【练习题1】输入2个数字,比较大小(使用if语句结合条件表达式实现) 

说明:

3个脚本:使用直接赋值,传参,read任一种方法写3种脚本(单分支,双分支,多分支)

示例脚本一:

[root@clsn panduan1]# cat if_panduan_1.sh
#!/bin/bash
#############################################################
# File Name: panduan1.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 $NUM1 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
fi

read -p "请输入第二个整数:" NUM2
expr 1 $NUM2 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
fi

if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
fi

if [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
fi
read方法 单分支

示例脚本二:

 

[root@clsn panduan1]# cat if_panduan_2.sh
#!/bin/bash
#############################################################
# File Name: if_panduan_2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 $NUM1 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
fi

read -p "请输入第二个整数:" NUM2
expr 1 $NUM2 &>/dev/null
if [ $? -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
else
if [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
else
if [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
fi
fi
fi
双分支

示例脚本三:

 

[root@clsn panduan1]# cat if_panduan_3.sh
#!/bin/bash
#############################################################
# File Name: if_panduan_3.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 11:27:32
# Description:
#############################################################

read -p "请输入第一个整数:" NUM1
expr 1 $NUM1 &>/dev/null
NUM1_FH=$?
if [ $NUM1_FH -eq 2 ]
then
echo "$NUM1 不是整数 "
exit 2
else
read -p "请输入第二个整数:" NUM2
expr 1 $NUM2 &>/dev/null
NUM2_FH=$?
if [ $NUM2_FH -eq 2 ]
then
echo "$NUM2 不是整数 "
exit 2
fi
fi

# 判断输入数值大小
if [ $NUM1 -eq $NUM2 ]
then
echo "$NUM1 = $NUM2"
exit
elif [ $NUM1 -gt $NUM2 ]
then
echo "$NUM1 > $NUM2"
exit
elif [ $NUM1 -lt $NUM2 ]
then
echo "$NUM1 < $NUM2"
fi
多分支

2、以上就是单分支的if语句,接下来看看双分支的if语法结构

1.2.4 【练习题2】系统内存低于100M邮件报警,加入计划任务,3分钟检查一次。

对于开发程序而言,一般来说应该遵循下面的3步法则。

(1)分析需求

    明白开发需求,是完成程序的大前提,因此,分析需求至关重要,一切不以需求为主的程序开发,都是耍流氓的!

(2)设计思路

设计思路就是根据需求,把需求进行拆解,分模块逐步实现,例如本题可以分为如下几步:

1)获取当前系统剩余内存的值(先在命令行实现)。

2)配置邮件报警(可采用第三方邮件服务器)。

3)判断取到的值是否小于100MB,如果小于100MB,就报警(采用if语句)。

4)编码实现Shell脚本。

5)加入crond定时任务,每三分钟检查一次。

(3)编码实现

    编码实现就是具体的编码及调试过程,工作中很可能需要先在测试环境下调试,调试好了,再发布到生产环境中。

第一步 先配置邮件服务,保证能够发生邮件

echo 'set from=mail@znix.top smtp=smtp.znix.top smtp-auth-user=mail@znix.top  smtp-auth-password=****** smtp-auth=login' >> /etc/mail.rc

发送测试邮件发送

echo "`date  %F_%T`" |mail -s "这是测试邮件" admin@znix.top

 

第二步编写检查脚本

 

[root@clsn scripts]# cat mem_info.sh 
#!/bin/bash
##############################################################
# File Name: mem_info.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 8:42:50
# Description:
##############################################################

Mem=`free -m |awk 'NR==2{print $NF}'`
host=`hostname`
Ip=`hostname -I`
Date=`date  %F_%T`
mail_file=/tmp/mail.s
dest_user=admin@znix.top

if [ $Mem -lt 100 ]
then
   echo "发生时间: $Date" >$mail_file
   echo "发生主机: $host  主机IP地址: $Ip " >> $mail_file
   echo "内存余量: $Mem M" >> $mail_file
   mail -s "【警告】内存不足了呀!"  $dest_user < $mail_file
fi

 

第三步测试脚本(可以修改判断的值)

[root@clsn scripts]# sh mem_info.sh

 

第四步 脚本测试成功,写入定时任务

[root@clsn panduan1]# crontab -l 
# 检查内存剩余大小
*/3 * * * * /bin/sh /server/scripts/panduan/mem_info.sh  &>/dev/null

至此,一个监控脚本就写好了

if <条件表达式> 
 then 
 指令一 
 else 
 指令二 
fi 

1.2.5 【练习题3】模拟编写启动nginx脚本

脚本内容

 

[root@clsn scripts]# cat nginx.sh
#!/bin/bash
##############################################################
# File Name: nginx.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 20:56:06
# Description:
##############################################################
. /etc/init.d/functions

StartCheck=`netstat -lntup |grep -c 80`
StartCMD='/application/nginx/sbin/nginx '
StopCMD='/application/nginx/sbin/nginx -s stop '
StatusCheck=`netstat -lntp|grep -c nginx`
ReloadCMD='/application/nginx/sbin/nginx -s reload'
CheckCMD='/application/nginx/sbin/nginx -t'
UsaGe="Usage: $0 {start|stop|status|reload|check}"

COMMAND=$1

if [ $# -ne 1 ]
then
echo $UsaGe && exit 2
fi

if [ $COMMAND = start ]
then
if [ $StartCheck == 1 ]
then
action "启动Nginx失败,端口被占用" /bin/false
else
$StartCMD
action "启动Nginx" /bin/true
fi
elif [ $COMMAND = stop ]
then
$StopCMD &>/dev/null
if [ $? -eq 0 ]
then
action "停止Nginx" /bin/true
else
action "停止Nginx" /bin/false
fi
elif [ $COMMAND = status ]
then
if [ $StatusCheck -eq 1 ]
then
echo "nginx 正在运行..."
else
echo "Nginx 未运行."
fi
elif [ $COMMAND = reload ]
then
$ReloadCMD
action "reload" /bin/true
elif [ $COMMAND = check ]
then
$CheckCMD
else
echo $UsaGe
exit 2
fi
nginx 启动脚本

脚本执行过程: 

 

以上就是单分支的if语句结构,那么在举个例子如下:

1.2.6 【练习题5】Web及MySQL服务异常监测案例

用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。

脚本编写思路:

判断web服务器正常 ↓

  1、进程 ps -ef |grep [n]ginx
  2、端口  netstat  ss losf telnet  nc  nmap 
  3、curl 页面 返回值
  4、curl check.html 的内容

判断mysql服务器正常 ↓

    1、端口 netstat  ss losf telnet  nc  nmap
    2、进程 ps -ef |grep [m]ysql
    3、mysql 登录访问看一下
    4、mysql insert一个数据 select一个数据

*web服务监控脚本示例***

 

[root@clsn scripts]# cat web_check.sh
#!/bin/bash
#############################################################
# File Name: web_check.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-07 10:53:38
# Description:
#############################################################
. /etc/init.d/functions

JinChen=`ps -ef |grep -c [n]ginx`
QiDong='/server/scripts/nginx.sh start'
StatuS=`curl -I -w "%{http_code}n" -o /dev/null -s 10.0.0.180`
StatuS2=`curl -s 10.0.0.180/check.html|grep -c ok`
StartNginx='/server/scripts/nginx.sh start'

if [ $JinChen -ge 2 ]
then
if [ "$StatuS" -eq 200 ]
then
if [ "$StatuS2" -eq 1 ]
then
action "Nginx 服务运行正常" /bin/true
else
action "请检查chenk.html文件!" /bin/false
fi
else
action "请检查首页文件!" /bin/false
fi
else
action "Nginx 未正常运行!" /bin/false
$StartNginx
fi
web 监控脚本内容

脚本执行过程:

 

回到顶部

if [ -f file ] 
 then 
 echo "这是一个普通文件" 
 else 
 echo "NONONO" 
fi 

1.3 case条件结构语句

这个和以上的例子是一样的。同样是测试file是不是一个普通文件,如果是,那么就输出指令1 否则那么就输出指令2

1.3.1 case语法结构

 

case "字符串变量" in 
  值1)
     指令1
     ;;
  值2)
     指令2
     ;;
  值*)
     指令
esac

 

到这里我们在来一个形象描述

1.3.2 case与if的对比

case书写方式

 

case $name in
  值1) 
      指令1
      ;;
  值2) 
      指令2
      ;;
   *) 
      指令
esac

 

if书写方式

 

if [ $name == "值1" ]
  then 
    指令1
elif [ $name == "值2" ]
  then 
    指令2
else
    指令    
fi

 

如果 <你不会if语句> 
 那么 
  就快点学,快点练 
 否则 
  你永远都不可能学会 
果如 

1.3.3 case值的书写方式

apple)

      echo -e "$RED_COLOR apple $RES"

      ;;

也可以这样写,输入2种格式找同一个选项

apple|APPLE)

      echo -e "$RED_COLOR apple $RES"

      ;;

我们发现 单分支和双分支的区别就在于一个有else 一个没有。

1.3.4 case语句小结

   

本文由威尼斯wns.9778官网活动发布于计算机教程,转载请注明出处:【威尼斯wns.9778官网活动】详解Shell编程之if语句

关键词: