码迷,mamicode.com
首页 > 系统相关 > 详细

Shell之二

时间:2018-03-27 16:36:34      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:Shell

Shell

第1章 条件表达式

1.1 判断一个文件或者目录是否存在

[root@nfs01 scripts]# [ -f /etc/hosts ] && echo "file true" || echo "file fleas"

file true

[root@nfs01 scripts]# [ -f /etc/hostaaas ] && echo "file true" || echo "file fleas"

file fleas

[root@nfs01 scripts]# [ -d /etc/ ] && echo "yes" || echo "no"

yes

[root@nfs01 scripts]# [ -d /essstc/ ] && echo "yes" || echo "no"

no

[root@nfs01 scripts]# [ -d /etc/ ]

[root@nfs01 scripts]# echo $?

0

常用文件测试操作符

说明

-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旧则为真,即测试表达式成立。根据文件的修改时间来计算

 

1.2 字符串判断

1.2.1 常用字符串操作符

常用字符串测试操作符

说明

-n "字符串"

若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero

-Z "字符串"

若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写

" 1"== " 2"

若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"="

" 1" = " 2"        

若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="

 

-z  表示字符传为0

-n  表示不为0

[root@nfs01 scripts]# $date_cmd

2018-03-23

[root@nfs01 scripts]# [ -z "$date_cmd" ] && echo yes || echo no

no

[root@nfs01 scripts]# [ -n "$date_cmd" ] && echo yes || echo no

yes

1.2.2 判断两个数字是否相等

[root@nfs01 scripts]# x=1

[root@nfs01 scripts]# y=2

[root@nfs01 scripts]# [ "$x" = "$y" ]

[root@nfs01 scripts]# echo $?

1

[root@nfs01 scripts]# [ "$x" = "$y" ] && echo yes ||echo no

no

[root@nfs01 scripts]# [ "$x" != "$y" ] && echo yes ||echo no

yes

1.3 整数判断

1.3.1 常用的比较操作符

[]以及test

使用的比较符号

(())[[]]

使用的比较符号

说明

-eq

===

相等,全拼为equal

-ne

=

不相等,全拼为not equal

-gt

大于,全拼为greater than

-ge

>=

大于等于,全拼为greater equal

-lt

小于,全拼为丨ess than

-le

<=

小于等于,全拼为less equal

[root@nfs01 scripts]# [ 2 -eq 2 ] && echo yes ||echo no            等于

yes

[root@nfs01 scripts]# [ 2 -ne 2 ] && echo yes ||echo no            不等于

no

[root@nfs01 scripts]# [ 3 -ge 2 ] && echo yes ||echo no            大于等于

yes

[root@nfs01 scripts]# [ 1 -gt 2 ] && echo yes ||echo no             大于

no

[root@nfs01 scripts]# [ 4 -lt 1 ] && echo yes ||echo no             小于

no

[root@nfs01 scripts]# [ 4 -lt 7 ] && echo yes ||echo no             小于等于

yes

 

1.4 逻辑操作符

技术分享图片

1.1.1 两个都必须是真

[root@nfs01 scripts]# [ 4 -lt 7 -a 3 -ge 2 ] && echo yes ||echo no

yes

1.1.2 其中有一个为真就行

[root@nfs01 scripts]# [ 24 -lt 7 -o 3 -ge 1 ] && echo yes ||echo no

yes

1.1.3 叹号表示取反

[root@nfs01 scripts]# [ 2 -lt 7 -o ! 3 -ge 1 ] && echo yes ||echo no

yes

第2章 开发3shell脚本,比较两个整数大小

2.1 使用条件表达式完成shell脚本:

2.1.1 采用定义变量的方法:

[root@nfs01 scripts]# cat bianliang.sh

#!/bin/bash

##############################################################

# File Name: bianliang.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 09:15:12

# Description:

##############################################################

 

x=1

y=2

 

[ $x -eq $y ] && echo x=y && exit 2

[ $x -gt $y ] && echo x>y && exit 2

echo x\<y

2.1.2 采用传参的方法

[root@nfs01 scripts]# vim duibi.sh

 

#!/bin/bash

##############################################################

# File Name: duibi.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 03:51:37

# Description:

##############################################################

 

[ $# -ne 2 ] && echo "please input two num" && exit

 

expr $1 + 1 >/dev/null

[ $? -ne 0 ] && echo "please input zhengshu" && exit

 

expr $2 + 1 >/dev/null

[ $? -ne 0 ] && echo "please input zhengshu" && exit

 

[ $1 -eq $2 ] && echo "num1 = num2" && exit

[ $1 -gt $2 ] && echo "num1 > num2" && exit

echo "num1 < num2"

2.1.3 采用read方法

[root@nfs01 scripts]# cat daxiao_1.sh

#!/bin/bash

##############################################################

# File Name: daxiao.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-22 20:10:36

# Description:

##############################################################

 

read -p "please input num1:" num1

read -p "please input num2:" num2

 

if expr $num1 + 1 >/dev/null 2>&1;then echo 1 >/dev/null;else echo "please input zhengshu" && exit;fi

if expr $num2 + 1 >/dev/null 2>&1;then echo 1 >/dev/null;else echo "please input zhengshu" && exit;fi

 

[ $num1 -eq $num2 ] && echo num1=num2 && exit 2

[ $num1 -gt $num2 ] && echo num1\>num2 && exit 3

[ $num1 -lt $num2 ] && echo num1\<num2 && exit 4

2.2 使用if语句判断两个数字的大小:

[root@nfs01 scripts]# cat duibi_if.sh

#!/bin/bash

##############################################################

# File Name: duibi.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 03:51:37

# Description:

##############################################################

 

if [ $# -ne 2 ];then

    echo "please input two num"

    exit

  elif expr $1 + 1 >/dev/null 2>&1

if [ $? -ne 0 ];then

    echo "please input zhengshu"

    exit

fi

 

expr $2 + 1 >/dev/null 2>&1

if [ $? -ne 0 ];then

    echo "please input zhengshu"

    exit

fi

 

if [ $1 -eq $2 ];then

    echo "num1 = num2"

elif [ $1 -gt $2 ];then

    echo "num1 > num2"

else

    echo "num1 < num2"

fi

第3章 系统内存低于多少时,自动发送邮件报警,并加入定时任务,每三分钟检查一次

3.1 在编写shell脚本时,要有清晰的思路,应该遵循三个法则

1.      分析你的需求

清除自己为什么写这个脚本,要用这个脚本达到什么目的

2.      设计思路

根据自己的需求,进行拆解,分步骤实现:

例如本题,我要先查看系统内存

然后利用第三方发送邮件

在系统内存低于多少时自动发送邮件

编写shell脚本

写入定时任务

3.      编码实现

[root@nfs01 scripts]# cat free.sh

#!/bin/bash

##############################################################

# File Name: free.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-22 20:33:10

# Description:

##############################################################

 

name=`free -m|awk 'NR==2{print $4}'`

date_cmd='date +%F-%s'

 

if [ $name -gt 50 ];then

    exit

else

    echo "`${date_cmd}` free is no space" >/tmp/free.log

    mail -s "free is no" 15555513217@163.com </tmp/free.log

fi

第4章 编写nginx启动脚本:

4.1 简单的思路:

1.      首先要判断命令输入是否正确,如果不正确进行提示

2.      在执行脚本后输入优雅提示

3.      在启动时,判断端口是否存在,如果存在输出已经启动的信息然后退出

4.      停止时,直接pkill nginx即可

5.      重启服务时,判断进程是否存在,如果存在直接reload,如果不存在直接启动

[root@nfs01 scripts]# cat nginx.sh

#!/bin/bash

##############################################################

# File Name: nginx.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 00:50:54

# Description:

##############################################################

. /etc/init.d/functions

 

start_cmd='/application/nginx/sbin/nginx'

stop_cmd='pkill nginx'

restart_cmd='/application/nginx/sbin/nginx -s reload'

#port_cmd='ss -tunlp|grep 80|wc -l'

 

if [ $# -ne 1 ];then

    echo "please input $0 start|stop|restart"

    exit

fi

 

if [ $1 = start ];then

   if [ `ss -tunlp|grep 80|wc -l` -eq 1 ];then

    action 'nginx is alrealy started' /bin/true

   else

    $start_cmd

    action 'nginx is started' /bin/true

   fi

fi

 

if [ $1 = stop ];then

    $stop_cmd

    action 'nginx is stoped' /bin/true

fi

 

if [ $1 = restart ];then

   if [ `ss -tunlp|grep 80|wc -l` -eq 1 ];then

    $restart_cmd

    action 'nginx restarted success' /bin/true

   else

    $start_cmd

    action 'nginx started success' /bin/true

   fi

fi

第5章 编写监控nginx脚本,实现当服务不存在时,启动服务

5.1 监控nginx简单思路:

1.      查看进程是否存在,不存在则进行重启

2.      检查端口是否存在

3.      如果存在,访问网站首页,判断是否正常,http响应报文中的返回值,并判断是否为200

[root@nfs01 scripts]# vim monitor.sh

 

# File Name: monitor.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 10:00:25

# Description:

##############################################################

 

date_cmd=`date +%F-%s`

start_cmd='/application/nginx/sbin/nginx'

stop_cmd='pkill nginx'

restart_cmd='/application/nginx/sbin/nginx -s reload'

ps=`ps -ef|grep [n]ginx|wc -l`

port_cmd=`ss -tunlp|grep 80|wc -l`

curl_cmd=`curl -s -I 10.0.0.31 -w "%{http_code}\n" -o /dev/null`

 

if [ "$ps" -ne 2 ];then

    $start_cmd

    if [ "$port_cmd" -ne 1 ];then

       $stop_cmd

        sleep 2

         $start_cmd

          if [ "$curl_cmd" -ne 200 ];then

           echo -e "$date_cmd\n$curl_cmd"|mail -s "web service failed" 15555513217@163.com

          fi

    fi

fi

第6章 监控memcache:

6.1 编写思路:

1.      查看端口是否存在,如果不存在则重新启动服务

2.      使用set命令和get命令进行写入和读取数据,缓存服务是否正常

3.      如果get不到数据则提示,memcache服务可能出现异常

技术分享图片

第1章 case条件语句

1.1 case语法结构: 相当于if的多分支条件语句

case "字符串变量" in

  1)

     指令1

     ;;

  2)

     指令2

     ;;

  *)

     指令

esac

1.2 case值的书写方式:

apple)

      echo -e "$RED_COLOR apple $RES"

      ;;

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

apple|APPLE)

      echo -e "$RED_COLOR apple $RES"

      ;;

1.3 练习题:使用case语句编写菜单脚本:

1.3.1 目的:

使输入1时显示红色apple单词

      输入2时显示绿色pear单词

      输入3时显示×××banana单词

      输入4退出

1.3.2 脚本内容

[root@nfs01 scripts]# cat xuanze.sh

#!/bin/bash

##############################################################

# File Name: xuanze.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 15:23:15

# Description:

##############################################################

cat <<END

============

1.apple

2.pear

3.banana

4.exit

============

END

read -p "please input num:" num

 

case $num in

1)

   echo -e "\033[41;37m apple \033[0m"

   ;;

2)

   echo -e "\033[42;37m pear \033[0m"

   ;;

3)

   echo -e "\033[43;37m banana \033[0m"

   ;;

4)

   exit

   ;;

*)

   echo -e "\033[47;30m Usage: input { 1|2|3|4 } \033[0m"

   ;;

esac

技术分享图片

1.1 编写管理rsync服务启动脚本

1.1.1 脚本思路:

1.      判断rsync的主配置文件是否存在,存在继续,不存在则退出

2.      判断873端口是否存在,如果存在表示服务正在运行,则退出,不存在则启动服务

3.      使只有输入start|stop|restart选项时,脚本才会执行,否则报错,显示使用规则

1.1.2 脚本内容:

[root@nfs01 scripts]# cat backup.sh

#!/bin/bash

##############################################################

# File Name: rsync.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 15:56:02

# Description:

##############################################################

. /etc/init.d/functions

 

if [ ! -f /etc/rsyncd.conf ];then

  action 'rsyncd.conf not exists' /bin/false

  exit

fi

start_cmd='rsync --daemon'

stop_cmd='pkill rsync'

port_cmd=`ss -tunlp|grep 873|wc -l`

 

case $1 in

start)

    if [ "$port_cmd" -eq 2 ];then

      action 'rsync service is already exists' /bin/true

      exit

    else

      $start_cmd

      action 'rsync started' /bin/true

    fi

    ;;

stop)

    $stop_cmd

    action 'rsync stoped' /bin/true

    ;;

restart)

    $stop_cmd

    action 'rsync stoped' /bin/true

    sleep 1

    $start_cmd

    action 'rsync started' /bin/true

    ;;

*)

    echo 'Please Usage: {start|stop|restart}'

esac

1.2 菜单自动化软件部署脚本实践

1.2.1 题目:打印选择菜单,按照选择一键安装部同的web服务

1.2.2 菜单示例:

[root@oldboy scripts]# sh menu.sh

    1.[install lamp]

    2.[install lnmp]

    3.[exit]

    pls input the num you want:

1.2.3 要求:

  1、当用户输入1时,输出“start installing lamp.提示然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本,工作中就是正式lamp一键安装脚本;

echo 'echo lampis installed' > /server/scripts/lamp.sh

chmod +x /server/scripts/lamp.sh

  2、当用户输入2时,输出“start installing lnmp.提示然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本,工作中就是正式lnmp一键安装脚本;

echo 'echo lnmpis installed' > /server/scripts/lnmp.sh

chmod +x /server/scripts/lnmp.sh

  3、当输入3时,退出当前菜单及脚本;  

  4、当输入任何其它字符,给出提示“Input error”后退出脚本;

  5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断。

1.2.4 脚本内容:

[root@nfs01 scripts]# cat menu.sh

#!/bin/bash

##############################################################

# File Name: menu.sh

# Version: V1.0

# Author: da ya

# Organization: 850144102@qq.com

# Created Time : 2018-03-23 20:29:43

# Description:

##############################################################

. /etc/init.d/functions

cat <<END

=================

1.[install LAMP]

2.[install LNMP]

3.[exit]

=================

END

read -p "please input the num you want:" num

lamp='/server/scripts/lamp.sh'

lnmp='/server/scripts/lnmp.sh'

case $num in

 1)

    if [ -x "$lamp" ];then

      echo 'start instaling LAMP'

      $lamp >/dev/null 2>&1

      action 'lamp is installed' /bin/true && exit

    else

      exit

    fi

    ;;

 2)

    if [ -x "$lnmp" ];then

      echo "start instaling LNMP"

      $lnmp >/dev/null 2>&1

      action "lnmp is installed" /bin/true && exit

    else

      exit

    fi

    ;;

 3)

    exit

    ;;

 *)

    echo "Input Error!" && exit

    ;;

esac

第2章 shell脚本小知识点

2.1 shell脚本的排错技巧

sh -x  脚本.sh

 -x 开启脚本调试模式

cat -A  文件.txt

-A  查看文件的隐藏字符

2.2 shell脚本段进行注释

2.2.1 方法一:

<<EOF

  内容

EOF

2.2.2 方法二:

一行注释方法 → : '内容'

段注释方法

:'

 http://blog.znix.top

'


Shell之二

标签:Shell

原文地址:http://blog.51cto.com/13520772/2091669

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!