常用文件测试操作符
常用文件测试操作符 |
说明 |
-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目录不存在"
字符串测试操作符
常用字符串测试操作符 |
说明 |
-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
整数二元比较操作符参考
在[]以及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中使用的操作符 |
说明 |
在[[]]和中使用的操作符 |
说明 |
-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. 分别以定义变量,脚本传参以及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语句可以互相转换
单分支语句
- 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
单分支:一个条件一个结果
双分支:一个条件两个结果
多分支:多个条件多个结果
说明:
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
示例脚本二:
- [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
对于开发程序而言,一般来说应该遵循下面的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
至此,一个监控脚本就写好了
脚本内容
- [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
脚本执行过程:
用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。
脚本编写思路:
判断web服务器正常 ↓
- 、进程 ps -ef |grep [n]ginx
- 、端口 netstat ss losf telnet nc nmap
- 、curl 页面 返回值
- 、curl check.html 的内容
判断mysql服务器正常 ↓
- 、端口 netstat ss losf telnet nc nmap
- 、进程 ps -ef |grep [m]ysql
- 、mysql 登录访问看一下
- 、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
脚本执行过程:
- case "字符串变量" in
- 值1)
- 指令1
- ;;
- 值2)
- 指令2
- ;;
- 值*)
- 指令
- esac
case书写方式
- case $name in
- 值1)
- 指令1
- ;;
- 值2)
- 指令2
- ;;
- *)
- 指令
- esac
if书写方式
- if [ $name == "值1" ]
- then
- 指令1
- elif [ $name == "值2" ]
- then
- 指令2
- else
- 指令
- fi
- apple)
- echo - e "$RED_COLOR apple $RES"
- ;;
也可以这样写,输入2种格式找同一个选项
- apple | APPLE)
- echo - e "$RED_COLOR apple $RES"
- ;;
来源: http://www.cnblogs.com/clsn/p/8006210.html