条件表达式

分支与循环结构

if语句是实际生产工作中最重要且最常用的语句,所以,必须掌握牢固。

if条件句

if条件句语法

  • 单分支结构

语法

  1. if [
    条件 ]

  2.   then

  3.     指令

  4. fi

  5. if [
    条件 ];then

  6.     指令

  7. fi

条件表达式[ -f “$file1” ]&& echo 1,相当于下面的if语句。

  1. if [
    -f “$file1” ];then

  2.     echo 1

  3. fi

  • 双分支结构
  1. if [
    条件 ]

  2.   then

  3.     指令集1

  4. else

  1.     指令集2

  2. fi

条件表达式[ -f “$file1” ]&& echo 1||echo 0,相当于双分支if [ -f
“$file1” ];then echo 1;else echo 0;fi。

  • 多分支结构
  1. if
    条件

  2.   then

  3.     指令

  4. elif 条件

  5.   then

  6.     指令

  7. elif 条件

  8.   then

  9.     指令

  10.     …

  11.   else

  1.     指令

  2. fi

单分支if条件句

开发shell脚本判断系统剩余内存的大小,如果低于100M就邮件报警给管理员,并加入系统定时任务每三分钟执行一次检查。

free -m|awk ‘NR==2{print $4}’

  1. [root@lamp ~]# cat free_m.sh
  1. #!/bin/bash

  2.  

  3. FREE=`free -m|awk ‘NR==3{print $4}’`

  1. if [
    $FREE -lt 100 ]

  2.   then

  3.     echo “warning:The available memory $FREE.”

  1.     exit 0

  2. fi

  3. echo “The
    available memory $FREE.”

双多分支if条件句

用if双分支实现read读入的方式比较两个数的大小。

  1. [root@lamp ~]# cat c3.sh

  2. #!/bin/bash

  3. read -p “Pls input two nums: ” num01 num02

  1. [ -z $num01 ]&&{

  2.   echo “the num01 you input must be int.”

  1.   exit 2

  2. }

  3. [ -z $num02 ]&&{

  4.   echo “the num02 you input must be int.”

  1.   exit 2

  2. }

  3. expr $num01 + $num02 + 1
    &>/dev/null

  4. [ $? -ne 0 ]&&{

  5.   echo “the num you input must be int.”

  1.   exit 2

  2. }

  3. if [
    $num01 -lt $num02 ]

  4.   then

  5.     echo “$num01 < $num02.”

  6. elif [ $num01 -gt $num02 ]

  7.   then

  8.     echo “$num01 > $num02.”

  9.   else

  1.     echo “$num01 = $num02.”

  2. fi

用if双分支实现对nginx或mysql服务是否正常进行判断,使用进程数、端口、url的方式判断,如果进程没起,把进程启动。

web服务和数据库(mysql)的监控方法。

1、端口监控

本地监控:netstat、ss、lsof

远程监控:telnet、nmap、nc

telnet监控端口

  1. [root@lamp ~]# echo -e “n”|telnet www.baidu.com 80|grep
    Connected|wc -l

  2. Connection closed by foreign host.

  1. 1

nmap监控端口

  1. [root@lamp ~]# nmap www.baidu.com -p
    80|grep open|wc -l

  2. 1

nc监控端口

  1. [root@lamp ~]# nc -z 192.168.163.128
    22|grep succeeded|wc -l

  2. 1

2、进程监控

本地监控:ps -ef|grep mysql|wc -l

3、wget、curl,http方式根据返回值或者返回内容判断。

4、header(http),http方式根据状态码判断。

5、数据库特有通过mysql客户端连接,根据返回值或者返回内容判断。

  1. [root@lamp ~]# cat check_db.sh
  1. #!/bin/bash

  2. #local

  3. if [
    “`netstat -lnt|grep 3306|awk -F
    “[ :]+” ‘{print $5}’`”
    = “3306” ]

  4. #if
    [ `ps -ef|grep mysql|grep -v grep|wc -l` -gt 0 ]

  5. #if
    [ `netstat -lntup|grep mysqld|wc -l` -gt 0 ]

  6. #if
    [ `lsof -i tcp:3306|wc -l` -gt 0 ]

  7.  

  8. #remote

  9. #if
    [ `nmap 192.168.1.123 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]

  10. #if
    [ `nc -w 2 192.168.1.123 3306 &>/dev/null&&echo ok|grep ok|wc -l` -gt 0 ]

  1.   then

  2.     echo “Mysql is Running.”

  3. else

  1.     echo “Mysql is Stopped.”

  2.     /deta/mysql start

  3. fi

 

  1. [root@lamp ~]# cat check_web.sh
  1. #!/bin/bash

  2. if [
    “`curl -I -s -o /dev/null -w
    “%{http_code}n”
    ” = “200” ]

  3. #if
    [ `curl -I
    2>/dev/null|head -1|egrep “200|302|301″|wc -l` -eq 1 ]

  1. #curl -s &>/dev/null

  2. #if
    [ $? -eq 0 ]

  3. #if
    [ “`curl -s
    &>/dev/null&&echo $?`” = “0” ]

  4. #if
    [ “`curl -s
    ” = “bbs” ]

  5.   then

  6.     echo “httpd is running.”

  7. else

  1.     echo “httpd is stopped.”

  2. fi

 

通过传参的方式往/etc/user.conf里添加用户,具体要求如下:

1、命令用法:USAGE:sh adduser {-add|-del|-search} username

2、传参要求:如果参数为-add,表示添加后面接的用户名;如果参数为-del,表示删除后面接的用户名;如果参数为-search,表示查找后面接的用户名。

3、如果有同名的用户则不能添加,没有对应用户则无需删除,查找到用户以及没有用户时给出明确提示。

4、/etc/user.conf不能被所有外部用户之间删除或修改。

  1. [root@lamp ~]# cat user.sh

  2. #!/bin/bash

  3. ROOT_UID=0

  4.  

  5. if [
    “$UID” -ne “$ROOT_UID” ]

  6.   then

  7.     echo “Mast be root to run this script.”

  1.     exit 1

  2. fi

  3. if [
    $# -ne 2 ]

  4.   then

  5.     echo “USAGE:sh $0 {-add|-del|-search}
    username.”

  6.     exit 2

  7. fi

  8. check=$1

  9. name=$2

  10. if [
    “$check” = “add” ]

  11.   then

  12.     result=`cat /etc/user.conf|grep
    -Fx “$name”`

  13.     [ -z $result ]&&{

  14.       echo “$name” >> /etc/user.conf

  15.       echo “user add “$name” is ok.”

  16.       exit 0

  17.     }

  18.     echo “user $name is in.”

  19.     exit 0

  20. elif [ “$check” = “del” ]

  21.   then

  22.     result=`cat /etc/user.conf|grep
    -Fx “$name”`

  23.     [ -z $result ]&&{

  24.       echo “user “$name” not find.”

  25.       exit 0

  26.     }

  27.     sed -ri /^$name$/d /etc/user.conf

  1.     echo “user del “$name” is ok.”

  2. elif [ “$check” = “search” ]

  3.   then

  4.     result=`cat /etc/user.conf|grep
    -Fx “$name”`

  5.     [ -z $result ]&&{

  6.       echo “user $name not find.”

  7.       exit 0

  8.     }

  9.     echo $result

  10.     exit 0

  11. else

  1.     echo “USAGE:sh $0 {-add|-del|-search}
    username.”

  2.     exit 1

  3. fi

 

获取文件md5值,防篡改。

  1. [root@lamp ~]# find ./ -type f|xargs
    md5sum

将md5值写入文件。

  1. [root@lamp ~]# find ./ -type f|xargs
    md5sum >/tmp/md5list

比较md5值。

  1. [root@lamp ~]# md5list -c
    /tmp/md5list