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 
 

read -p "Pls input two num:" a b
#1.第一关判断传入的内容都是整数
expr $a + $b + 100 &>/dev/null
[ $? -ne 0 ] &&{
   echo "Usage:$0 num1 num2"
   exit 1
}

#2.第二关输入两个数
[ -z "$b" ] &&{
   echo "Usage:$0 num1 num2"
   exit 2
}
#3.比较大小
[ $a -gt $b ] && {
   echo "$a>$b"
   exit 0
}

[ $a -eq $b ] && {
   echo "$a=$b"
   exit 0
}
echo "$a<$b"
exit 0

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文件存在"
else
   bu鸟你
fi

1.2.2 if条件语句小结

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

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

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

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

说明:

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

示例脚本一:

read   -t 15 -p "请输入两个数字:"  a  b
if  [ -z "$b" ]
then
    echo "请输入两个数字"
    exit 1
fi
expr $a + $b + 1 &>/dev/null
if [[ $? != 0 ]]
then
    echo "请输入数字"
    exit 2
fi
if [[ $a = $b ]]
then
    echo "="
elif [[ $a > $b ]]
then
    echo ">"
else
    echo "<"
fi

1.2.4 使用read读入的方式写出银行卡账号密码

[root@DB3 scripts]# vim yihang.sh 
read -p "请输入银行卡帐号:"  a
read -s  -p "请输入银行卡密码:"  b
expr $a + 1 + $b &>/dev/null
 
if [[ $? != 0 ]]
then
    echo "请输入正确的卡号密码"
    exit 1
fi
length=`echo ${#a}`
length2=`echo ${#b}`                                                  
if [ $length -ne 10 ]
then
    echo "卡号格式错误"
fi
if [ $length2 -ne 6 ]
then
    echo "密码格式错误"
fi

1.2.5 系统内存低于100M邮件报警,加入计划任务,3分钟检查一次。

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

(1)分析需求

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

(2)设计思路

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

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

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

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

4)编码实现Shell脚本。

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

(3)编码实现

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

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


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

第二步编写检查脚本

[root@DB3 scripts]# cat  nc.sh

#!/bin/bash

free=` free -m |awk 'NR==3{print $NF}'`

host=`hostname`

ip=`hostname -I`

data=`date +%F-%T`

if [ $free -le 100 ]

then

echo "发生时间:$data" >/tmp/free.log

echo "发生主机:$host $ip" >>/tmp/free.log

echo "内存余量:$free M" >>/tmp/free.log

mail -s "内存不足" 542154983@qq.com </tmp/free.log

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

[root@clsn scripts]# sh mem_info.sh

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

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

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

1.2.6 模拟编写启动nginx脚本

脚本内容

 1 [root@clsn scripts]# cat nginx.sh 
 . /etc/init.d/functions
start(){
    nginx_pid_file_path=/application/nginx/logs/nginx.pid
    if ! test -s "$nginx_pid_file_path"
    then
        /application/nginx/sbin/nginx
        retval=$?
        if [ $retval -eq 0 ]
        then
            action "nginx start" /bin/true
            return $retval
        else
            action "nginx start" /bin/false
            return $retval
        fi
    else
        echo "nginx is started"
    fi
}
 
stop(){
    nginx_pid_file_path=/application/nginx/logs/nginx.pid
    if test -s "$nginx_pid_file_path"
    then
        nginx_pid=`cat $nginx_pid_file_path`
        if (kill -0 $nginx_pid 2>/dev/null)
        then
            echo "Shutting down nginx"
            kill $nginx_pid
            retval=$?
            if [ $retval -eq 0 ]
            then
                action "nginx stop" /bin/true
                return $retval
            else
                action "nginx stop" /bin/false
                return $retval
            fi
        else
            echo "ngnix process is not exist."
        fi
    else
        echo "nginx is stopped."
    fi
}
 
case $1 in
    start)
        start
        retval=$?
        ;;
    stop)
        stop
        retval=$?
        ;;
    restart)
        stop
        start
        retval=$?
        ;;
    *)
        echo -e "USAG:$0 {start|stop|restart}"
esac
exit $retval

1.2.7 【练习题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服务监控脚本示例

 1 [root@clsn scripts]# cat  web_check.sh 
 2 #!/bin/bash
 3 #############################################################
 4 # File Name: web_check.sh
 5 # Version: V1.0
 6 # Author: clsn
 7 # Organization: http://blog.znix.top
 8 # Created Time : 2017-12-07 10:53:38
 9 # Description:
10 #############################################################
11 . /etc/init.d/functions
12 
13 JinChen=`ps -ef |grep -c  [n]ginx`
14 QiDong='/server/scripts/nginx.sh start'
15 StatuS=`curl -I -w "%{http_code}\n" -o /dev/null -s   10.0.0.180`
16 StatuS2=`curl -s 10.0.0.180/check.html|grep -c ok`
17 StartNginx='/server/scripts/nginx.sh start'
18 
19 if [ $JinChen -ge 2  ]
20   then 
21     if [ "$StatuS" -eq 200 ]
22       then
23         if [ "$StatuS2" -eq 1 ]
24           then
25             action "Nginx 服务运行正常" /bin/true
26           else
27             action "请检查chenk.html文件!" /bin/false
28         fi
29     else
30       action "请检查首页文件!" /bin/false
31     fi
32 else
33     action "Nginx 未正常运行!" /bin/false
34     $StartNginx    
35 fi

web 监控脚本内容

脚本执行过程:

1.3 函数

1.3.1 函数的作用

函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。

1.3.2 函数的三种语法

1.Function   函数名(){  # 推荐

指令

Return  n

2.function函数名{  不推荐

指令

Return  n

3.函数名(){ #不用function的方法

指令

Return n

1.3.3 执行方法

函数名

1.函数要先定义在使用

2.函数里定义变量用local

3.函数的返回值用return

脚本里返回值用exit返回

函数也可以接参数

4.带参数的函数执行方法,格式如下:

函数名  参数1  参数2

5.函数后接的参数说明

.Shell的位置参数($1 $2……..$#  $*  $?)都可以作为函数的参数使用

.此时父脚本的参数临时地被函数参数所掩盖或隐藏

.$0比较特殊,他仍然是父脚本的名称

当函数执行完成时原来的命令行脚本的参数既恢复

.函数的参数变量是在函数体里面定义的

1.3.4 格式例子

function  oldboy(){

echo  "i am oldboy"

}

oldgirl(){

echo  "i  am  girl"

}

oldboy

oldgirl

1.4 case条件结构语句

1.4.1 case语法结构

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

1.4.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.4.3 case值的书写方式

apple)
 
      echo -e "$RED_COLOR apple $RES"
 
      ;;

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

apple|APPLE)
 
      echo -e "$RED_COLOR apple $RES"
 
      ;;

1.4.4 case语句小结

   

shell编程中的更多相关文章

  1. Shell编程中Shift的用法

    Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shif ...

  2. Shell编程中while与for的区别及用法详解【转】

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用 ...

  3. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

  4. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  5. shell编程中如何执行oracle语句

    shell编程中如果向oracle中插入数据之类的,需要先把执行语句放到文件中,然后再@这个文件执行 有如下俩种方式供参考: SQL=`sqlplus user/pwd@orains << ...

  6. shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法

    shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...

  7. shell编程中的单/双 小括号, 中括号, 大括号

    linux shell中的变量类型?分字符串或者数字或者bool类型吗? 参考: http://www.cnblogs.com/nufangrensheng/p/3477281.html 不分! sh ...

  8. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

  9. shell编程中用户输入处理(shell 04)

    shell编程中用户输入处理1.命令行参数2.脚本运行时获取输入 命令行参数 通过空格来进行分割的位置参数 :$+position $0,$1,$2 ....$0 :程序名$1,$2,$3 ... $ ...

  10. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

随机推荐

  1. 根据/proc/meminfo对空闲内存进行占用

    #include <stdio.h> #include <sys/sysinfo.h> #include <linux/kernel.h> /* 包含sysinfo ...

  2. 【总结整理】json数据请求简化版理解(祺哥的成果)

    在同源js目录下新建.txt文件 { "news":[ {"title":"审计管理","time":"201 ...

  3. HTML->CSS->JS->PHP的顺序及相关网址(转)

    如果你有耐心坚持一年以上的话, 我会推荐HTML->CSS->JS->PHP的顺序来学习. 1. HTML学习:首先学习HTML,HTML作为标记语言是非常容易学的,把w3schoo ...

  4. 奇葩问题 eclipse下 maven项目 java Resource报个小红叉,然而里面却没有小红叉

    之前没注意,不知是一开始就有还是这两天才有,说下解决方案: 右击项目“Properties”,在弹出的“Properties”的左侧边框,单击“Project Facets”,打开“Project F ...

  5. php学习笔记-多维数组

    多维数组就是有一个数组,它里面的每个元素又是一个数组. <?php $stuff =array('food'=>array('apple','orange'),'book'=>arr ...

  6. Django框架 之 ORM 常用字段和参数

    Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...

  7. Python中list常用的10个基本方法----list的灰魔法

    ########################list 的常用的10个基本方法################################## list 类 列表# 1 列表的基本格式#2 可以 ...

  8. Bulma 源码结构

    源码基于 Bulma 0.4.0 版本. 一.入口文件 bulma.sass bulma.sass 是 Bulma 使用 SASS 编译的入口文件. sass bulma.sass css/bulma ...

  9. SpringMvc配置web.xml避免view被dispatcherServlet拦截

    在我们以SpringMvc作为开发框架,开发接口框架时,我们只用到Controller一层,因为数据是交到前端处理的,所以我们是不需要处理视图的.此时,在配置dispatcherServlet时,一般 ...

  10. jquery ajax 分页

    <script src="../Js/jQuery/jquery-1.8.2.min.js" type="text/javascript">< ...