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 || echo 0相当于下面:
if [ -f "$file1" ]
then
echo
else
echo
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
[]
[]
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:
Swap: 3840 #<---这里取3840这个值作为可用内存
[root@web1 ~]# free -m |awk 'NR==3{print $NF}' #<---利用awk获取到3840单位时MB [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 - /etc/mail.rc
set from=zhutoyearn@.com smtp=smtp..com
set smtp-auth-user=zhutoyearn smtp-auth-password=xxxxxxxx smtp-auth=login
[root@web1 ~]# echo "zxg"|mail -s "title" zhutoyearn@.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,则执行命令
then
echo $CHARS|tee /tmp/messages.txt #<---屏幕输出提示,并写入文件
mail -s "`date +%F-%T` $CHARS" zhutoyearn@.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 crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#monitor sys mem at 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 crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#monitor sys mem at by zxg
*/ * * * * 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
fi
if [ $a -gt $b ];then #<--如果$a大于$b,则执行命令,同理,成功后以0值退出脚本
echo "yes,$a greater than $b"
exit
fi
[root@web1 scripts]# chmod +x test17.sh
[root@web1 scripts]# ./test17.sh
pls input two num:
yes, less than
[root@web1 scripts]# ./test17.sh
pls input two num:
yes, greater than
[root@web1 scripts]# ./test17.sh
pls input two num:
yes, equal
[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:
yes, equal 2
[root@web1 scripts]# ./test18.sh
pls input two num:
yes, less than
[root@web1 scripts]# ./test18.sh
pls input two num:
yes, greater than
方法3 用脚本传参的方式比较整数大小(单分支)
[root@web1 scripts]# cat test19.sh
#!/bin/bash
a=$
b=$
if [ $a -lt $b ];then
echo "yes,$a less than $b"
exit
fi
if [ $a -eq $b ];then
echo "yes,$a equal $b"
exit
fi
if [ $a -gt $b ];then
echo "yes,$a greater than $b"
exit
fi [root@web1 scripts]# chmod +x test19.sh
[root@web1 scripts]# ./test19.sh
yes, less than
[root@web1 scripts]# ./test19.sh
yes, less than
[root@web1 scripts]# ./test19.sh
yes, equal
[root@web1 scripts]# ./test19.sh
yes, greater than
[root@web1 scripts]#
方法4 用脚本传参的方式比较整数大小(多分支)
[root@web1 scripts]# cat test20.sh
#!/bin/bash
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]# ./test20.sh
yes, equal
[root@web1 scripts]# ./test20.sh
yes, greater than
[root@web1 scripts]# ./test20.sh
yes, less than
[root@web1 scripts]#
转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/11158122.html
shell 学习笔记5-shell-if语句的更多相关文章
- Shell学习笔记之shell脚本和python脚本实现批量ping IP测试
0x00 将IP列表放到txt文件内 先建一个存放ip列表的txt文件: [root@yysslopenvpn01 ~]# cat hostip.txt 192.168.130.1 192.168.1 ...
- shell 学习笔记9-while/until循环语句
一.while循环语句 1.循环语句 循环愈久就是重复执行一条指令或一组执行,知道条件不在满足时停止,shell循环语句包括,while.until.for.select语句 2.while循环 主要 ...
- 鸟书shell 学习笔记(一) shell专注于概念和命令
变量 variableName=value 等号左右不能有空格 变量内容有空格须要用"或者'括起来,可是 v="hello $name" $保持原有功能,单引號则不行 ...
- shell学习笔记2: shell中的四则运算符
shell中的四则运算符 n1,n2 :常量数字 char:运算符号 加,减,乘,除,取余(+,-,*,/,%) $a,$b:变量a,变量b 方法1 数字与符号之间需要有空格 不支持小数 expr n ...
- shell学习笔记1: shell 中的变量与常见符号使用方法
变量 声明即用 a=2 b="123" 调用 ${varName}或者 $varName echo $b echo ${a} 常见变量 $?:判断上一个语句是否成功 $0:执行脚本 ...
- 鸟书shell 学习笔记(二) shell中正則表達式相关
通配符与正則表達式的差别 通配符是bash原生支持的语法,正則表達式是处理字符串的一种表示方式, 正則表達式须要支持的工具支持才干够 语系设置 : export LANG=C grep alias 设 ...
- shell学习笔记汇总
1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...
- SHELL学习笔记三
SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
随机推荐
- vue入门|ElementUI使用指南
vue入门|ElementUI使用指南 1.开发前务必熟悉的文档: vue.js2.0中文,项目所使用的js框架 vue-router,vue.js配套路由 vuex 状态管理 Element UI框 ...
- Django微信小程序后台开发教程
本文链接:https://blog.csdn.net/qq_43467898/article/details/83187698Django微信小程序后台开发教程1 申请小程序,创建hello worl ...
- 网格布局 GridLayout
网格布局,按照行.列组成一个个网格 界面代码: <?xml version="1.0" encoding="utf-8"?> <GridLay ...
- SVL-VI SLAM
3.4. Mappoints management and key frame process如果在步骤3.3中成功跟踪地图点,则缓存地图点以在下一帧中优先化.当完成当前帧的跟踪时,应该为下一帧更新帧 ...
- yii2 HeadersAlreadySentException 报错 解决方案
报错如下: An Error occurred while handling another error: exception Stack trace: # /xxxx/xxxx/vendor/yi ...
- Linux查找含有特定字符串的文件
Linux查找含有特定字符串的文件命令为grep.以下为详细的使用方法 grep [OPTIONS] PATTERN [FILE...] #实例:递归查找当前文件夹下所有含有test的文件,并显示行号 ...
- 删除pod后又重新创建pod发现还是访问原先的服务状态---解决
因为做了数据持久化存储,需要删除数据目录下的数据才可以 参照: https://www.cnblogs.com/effortsing/p/10496391.html
- DALFactory出现"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .
自己在使用抽象工厂+配置文件+反射实现重构机房的过程中,遇到了这种情况, 当初自己认真的检查了反射中的代码,都是没有问题,请教了师姐,检查了抽象工厂与反射的使用都没有问题 // 查找我们将要使用的数据 ...
- 正则表达式入门教程&&经典Javascript正则表达式
前言 例子: ^.+@.+\\..+$ 这样的代码曾经多次把我自己给吓退过.可能很多人也是被这样的代码给吓跑的吧.继续阅读本文将让你也可以自由应用这样的代码. 正文 教程:正则表达式30分钟入门教程 ...
- RabbitMQ官方教程四 Routing(GOLANG语言实现)
在上一教程中,我们构建了一个简单的日志记录系统. 我们能够向许多消费者广播日志消息. 在本教程中,我们将向其中添加功能-我们将使仅订阅消息的子集成为可能. 例如,我们将只能将严重错误消息定向到日志文件 ...