1.1 条件表达式

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 f2nt 的全拼为 newer than

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

fl -ot f2ot 的全拼为 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

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 "不成立"
成立

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"

1.2 if条件语句

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

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

1.2.2 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

多分支

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

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

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 启动脚本

脚本执行过程:

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 监控脚本内容

脚本执行过程:

1.3 case条件结构语句

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

1.3.3 case值的书写方式

apple)

      echo -e "$RED_COLOR apple $RES"

      ;;

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

apple|APPLE)

      echo -e "$RED_COLOR apple $RES"

      ;;

1.3.4 case语句小结

   

Shell编程基础篇-下的更多相关文章

  1. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  2. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  3. 基于Linux系统的Shell编程-基础篇

    1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...

  4. Shell编程基础篇

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

  5. Shell编程基础篇-上

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

  6. Shell编程进阶篇(完结)

    1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或 ...

  7. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  8. 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(下)

    第1章.基础篇(下) Abstract: 数据通信.数据存储.动画.音频与视频.canvas.BOM.表单操作.列表操作 数据通信(HTTP协议) HTTP事务: 客户端向服务器端发送HTTP请求报文 ...

  9. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

随机推荐

  1. ALV添加文字输入框

    一.业务场景 在合同打印中,需要临时添加其他约定事项,在打印程序的ALV中添加其他事项字段,点击之后弹出文字输入窗口,点击确定,文字内容存表,并在ALV中展示,点击打印后,文字内容加载到smartfo ...

  2. Linux系统挂载操作mount详解

    在Linux系统中,文件系统不挂载是无法使用的.挂载,即是让文件系统在操作系统中可用.在Linux中使用mount命令来挂载文件系统,有永久性挂载和临时性挂载两种挂载方式. 1. 永久性挂载: 修改配 ...

  3. Linux crontab定时器设置(定期执行java程序)(转)

    Crontab 语法 Crontab语法一个crontab文件用五个段来定义:天,日期和时间,和一个要定期执行的命令代码. *    *  *  *   *  command to be execut ...

  4. uploadify 配置后,页面显示无效果

    uploadify使用的是Flash版本 谷歌浏览器:默认没有开启Flash,进行如下图设置即可

  5. POJ2318 TOYS(叉积判断点与直线的关系+二分)

    Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...

  6. zookeeper详解

    ZooKeeper 1.Zookeeper(***必须掌握***) 官方网址:http://zookeeper.apache.org/ Ø 什么是Zookeeper? l  Zookeeper 是 G ...

  7. awk内置函数

    gsub(r,s,t) 在字符串t中,用字符串s替换和正则表达式r匹配的所有字符串.返回替换的个数.如果没有给出t,缺省为$0 index(s,t) 返回s 中字符串t 的位置,不出现时为0 leng ...

  8. js判断对象还是数组

    1.对于Javascript 1.8.5(ECMAScript 5),变量名字.isArray( )可以实现这个目的 var a=[]; var b={}; Array.isArray(a);//tr ...

  9. js数组遍历some,foreach,map,filter,every对比

    1.  [...].some(ck)函数       ----      某个一个为true,则为true 对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true.如果都返回f ...

  10. android视频播放器系列(一)——系统播放器

    使用系统播放器(intent隐士调用)可以播放本地视频和网络视频,但是使用方式上稍微有点差别: 一.播放本地视频 Uri uri = Uri.parse("本地视频地址");Int ...