shell 学习笔记5-shell-if语句
一、if条件语句
1、语法
1)单分支结构
第一种 if <条件表达式> then 指令 fi 第二种 if <条件表达式>;then 指令 fi 上文的"<条件表达式>"部分可以时test、[]、[[]]、(())等条件表达式,甚至可以直接使用命令作为条件表达式。每个if语句都以if开头,并带有then,最后以fi结束 第二种语法中分号相当于命令换行,含义医院 当if后面的<条件表达式>成真时,就会执行then后面的指令或语句;否则,就会忽略then后面的指令或语句,转而执行fi下面的程序
条件语句还可以嵌套(就是if语句里面还有if条件语句)如下面语法示例:
if <条件表达式>
then
if <条件表达式>
then
指令
fi
fi
2)双分支结构
复习一下单分支
如果...,那么...
双分支
如果...,那么...,否则...
结构如下:
if <条件表达式> then 指令集1 else 指令集2 fi 测试条件表达式[ -f "$file1" ]&&echo 1 || echo 0相当于下面: if [ -f "$file1" ] then echo 1 else echo 0 fi
3)多分支结构
结构主体
如果...,那么...,否则如果...,那么...,否则如果...,那么...,否则...
结构如下:
if <条件表达式1> then 指令1 elif <条件表达式2> then 指令2 else 指令3 fi
注意:每个elif都必须带then,else没有then
4)条件表达式 test、[]、[[]]、(())等条件表达式语法
1.4.1、test条件表达式
if test then 指令 fi
1.4.2、[]条件表达式
if [ 字符串或算术表达式 ] then 指令 fi
1.4.3、[[]]条件表达式
if [[ 字符串表达式 ]] then 指令 fi
1.4.4、(())条件表达式
if (( 算术表达式 )) then 指令 fi
1.4.5、命令表达式
if 命令 then 指令 fi
二、if条件语句示例
1、单分支示例
1)把下面测试文件中表达式的语句改成if条件语句
[root@web1 scripts]# [ -f /etc/hosts ]&& echo 1
1
[root@web1 scripts]# [[ -f /etc/hosts ]]&& echo 1
1
[root@web1 scripts]# test -f /etc/hosts && echo 1
1
[root@web1 scripts]# chmod +x test15 chmod: cannot access ‘test15’: No such file or directory [root@web1 scripts]# chmod +x test15.sh [root@web1 scripts]# cat test15.sh #!/bin/bash if [ -f /etc/hosts ] then echo "[1]" fi if [[ -f /etc/hosts ]] then echo "[1]" fi if test -f /etc/hosts then echo "test1" [root@web1 scripts]# ./test15.sh [1] [1] test1
2)开发shell脚本判断系统剩余内存的大小,如果低于3850mb,就邮件报警给系统管理员,并且讲脚本加入系统定时任务,每3分钟执行一次
3步法则:
1)分析需求
2)设计思路
获取系统剩余内存值-命令
配置邮件报警-可用第三方邮件服务器
判断取值是否小于100mb,如小于就报警-if
编码实现shell脚本
加入crond定时任务,每三分钟检查一次
3)编码实现
1.取内存值
[root@web1 ~]# free -m total used free shared buff/cache available Mem: 1846 331 1107 12 407 1308 Swap: 3840 0 3840 #<---这里取3840这个值作为可用内存 [root@web1 ~]# free -m |awk 'NR==3{print $NF}' #<---利用awk获取到3840单位时MB 3840 [root@web1 ~]#
2.邮件设置
[root@web1 ~]# echo -e "set from=zhutoyearn@163.com smtp=smtp.163.com\nset smtp-auth-user=zhutoyearn smtp-auth-password=1qazxsw2 smtp-auth=login" >>/etc/mail.rc [root@web1 ~]# !tail tail -2 /etc/mail.rc set from=zhutoyearn@163.com smtp=smtp.163.com set smtp-auth-user=zhutoyearn smtp-auth-password=xxxxxxxx smtp-auth=login [root@web1 ~]# echo "zxg"|mail -s "title" zhutoyearn@163.com
查看邮箱是否收到邮件
3.开始写脚本
[root@web1 scripts]# cat test16.sh #!/bin/bash Freemem=`free -m|awk 'NR==3 {print $NF}'` #<---获取系统当前的内存值,赋给变量Freemem CHARS="current memory is $freemem." #<---定义字符串CHARS变量,作为输出及供邮件正文使用 if [ $Freemem -lt 3850 ] #<---判断如果小于3850,则执行命令 then echo $CHARS|tee /tmp/messages.txt #<---屏幕输出提示,并写入文件 mail -s "`date +%F-%T` $CHARS" zhutoyearn@163.com </tmp/messages.txt #发送邮件 fi [root@web1 scripts]# chmod +x test16.sh [root@web1 scripts]# ./test16.sh current memory is 3840. [root@web1 scripts]# cat /tmp/messages.txt current memory is 3840.
4.加入crond定时任务
no crontab for root [root@web1 scripts]# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #monitor sys mem at 20190717 by zxg */3 * * * * root /scripts/test16.sh &>/dev/null ~ ~
[root@web1 scripts]# crontab /etc/crontab #保存使其生效 [root@web1 scripts]# crontab -l SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #monitor sys mem at 20190717 by zxg */3 * * * * root /scripts/test16.sh &>/dev/null [root@web1 scripts]#
进入邮箱验证一下,没有问题
2、深入if语句(多分支)
1)分别使用read读入及脚本传参的方式比较两个整数的大小
方法1 read读入单分支
[root@web1 scripts]# cat test17.sh #!/bin/bash read -p "pls input two num:" a b #<---读入两个输入,分别复制给变量a和b if [ $a -lt $b ];then #<---如果$a小于$b,则执行命令 echo "yes,$a less than $b" #<---打印输出,提醒用户 exit 0 #<---判断完毕,成功执行,以0值退出脚本,此处如果不退出,则会继续执行下面的if语句,而这时不必要的 fi if [ $a -eq $b ];then #<---如果$a等于$b,则执行命令,同理,成功后以0退出脚本 echo "yes,$a equal $b" exit 0 fi if [ $a -gt $b ];then #<--如果$a大于$b,则执行命令,同理,成功后以0值退出脚本 echo "yes,$a greater than $b" exit 0 fi [root@web1 scripts]# chmod +x test17.sh [root@web1 scripts]# ./test17.sh pls input two num:1 2 yes,1 less than 2 [root@web1 scripts]# ./test17.sh pls input two num:2 1 yes,2 greater than 1 [root@web1 scripts]# ./test17.sh pls input two num:2 2 yes,2 equal 2 [root@web1 scripts]#
方法2,上面方法语法比较乱要写很多if,可以用多分枝语句如下:
[root@web1 scripts]# cat test18.sh #!/bin/bash read -p "pls input two num:" a b if [ $a -lt $b ];then echo "yes,$a less than $b" elif [ $a -eq $b ];then echo "yes,$a equal $b" else [ $a -gt $b ] echo "yes,$a greater than $b" fi [root@web1 scripts]# chmod +x test18.sh [root@web1 scripts]# ./test18.sh pls input two num:2 2 yes,2 equal 2 [root@web1 scripts]# ./test18.sh pls input two num:1 2 yes,1 less than 2 [root@web1 scripts]# ./test18.sh pls input two num:2 1 yes,2 greater than 1
方法3 用脚本传参的方式比较整数大小(单分支)
[root@web1 scripts]# cat test19.sh #!/bin/bash a=$1 b=$2 if [ $a -lt $b ];then echo "yes,$a less than $b" exit 0 fi if [ $a -eq $b ];then echo "yes,$a equal $b" exit 0 fi if [ $a -gt $b ];then echo "yes,$a greater than $b" exit 0 fi [root@web1 scripts]# chmod +x test19.sh [root@web1 scripts]# ./test19.sh yes, less than [root@web1 scripts]# ./test19.sh 1 2 yes,1 less than 2 [root@web1 scripts]# ./test19.sh 2 2 yes,2 equal 2 [root@web1 scripts]# ./test19.sh 2 1 yes,2 greater than 1 [root@web1 scripts]#
方法4 用脚本传参的方式比较整数大小(多分支)
[root@web1 scripts]# cat test20.sh #!/bin/bash a=$1 b=$2 if [ $a -lt $b ];then echo "yes,$a less than $b" elif [ $a -eq $b ];then echo "yes,$a equal $b" else [ $a -gt $b ] echo "yes,$a greater than $b" fi [root@web1 scripts]# ./test20.sh 1 1 yes,1 equal 1 [root@web1 scripts]# ./test20.sh 2 1 yes,2 greater than 1 [root@web1 scripts]# ./test20.sh 1 2 yes,1 less than 2 [root@web1 scripts]#
转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/11158122.html