shell脚本学习,常用脚本练习实战(一)

学习linux 命令,是一个量变到质变的过程,我们多看别人处理问题的方法,掌握一些命令及技巧,遇到不懂就去搜索查询,平时养成用命令的习惯,尽量不要用可视化的工具,久而久之,下笔如有神,呼之即来,当然做任何事情经验都是这样积累的

特别有用的命令我会加粗,还有一些是一些命令参数 的详解和用法

我错别字比较多,可能有些地方出现错误,那都是输入发的锅,聪明的你,猜一猜就知道上下文什么意思了,嘿嘿

shell脚本是个实现linux 系统及运维自动化管理的重要且必备的工具

1.首先需要熟练使用vi/vim编辑器的是使用,我们还需要ssh终端配置及.vimrc 的配置,这样我们的vim功能就会变得强大

2.linux 常用的150个常用的命令

3.shell中正则表达式 grep sed awk要熟练,称之为正则三剑客,awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大

4.常见的lnux 网络服务部署,及优化排错crond ,nfs,rsync,inotify,lanmp,sersync,ssh,Memcached

什么是shell ,shell是命令解释器,他在操作系统的最底层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,这种对话方式是交互式(及从输入命令,既可以得到shell的回应),或者非交互(执行脚本程序)的方式

shell脚本学习,常用脚本练习实战(一)_第1张图片

python 语言介绍,和shell差不多,大家可以对照参考

shell脚本学习,常用脚本练习实战(一)_第2张图片

一个清除日志的脚本

#!/bin/bash
#清除日志脚本
LOG_DIR=/var/log   #定义变量,用来存储要清楚的路径下的日志
ROOT_UID=0 # $UID是0的时候,表示用户具有root权限
#要使用root用户来运行脚本,其中-ne表示不等于,-gt表示大于,-lt小于,-eq等于,-ge大于等于,-le小于等于  ,linux 中逻辑与 -a  逻辑或 -o
if[ "$UID" -ne "$ROOT_UID" ]
 then
     echo "Must be root to run this script"
   exit 1
fi
# 首先进入对应的目录,如果目录不存在就提示 
# 这里用|| 逻辑与运算,我们可以如果目录存在 ,后面的报错就不会执行,如果不存在,就会报错
cd $LOG_DIR || {
   echo "Cannot change to necessary directory." >&2    # 这里的是将输出的信息 输出到标准错误输出流中
   exit 1
}

cat /dev/null > message && echo "Logs cleaned up." #清理成功打印输出日志
#  message 是路径下的文件 ,我们用/dev/null 来清空内容
#/dev/null 还可以将一些非标准的 输入流 写入到 /dev/null ,这样来可以屏蔽掉我们想展示的东西
exit 0
#退出之前返回0表示成功,返回1表示失败

(补充一个命令:我们在 启动一些软件时,通常是交互式的,我们想后台启动,我们可以在 启动命令 后面 输入  空格&)

当然我们清除日志的命令(应用场景,保留文件,清空内容)

 echo >test.log   或者>test.log 或者cat /dev/null > test.log

shell 脚本擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件,文件(如nfs,rsync,httpd,nginx,lvs等)多数启动文件都是纯文本类型的文件

shell在运维中的作用

shell脚本学习,常用脚本练习实战(一)_第3张图片

shell 脚本语言是弱类型语言,比较通用的有shell标准Bourne shell (sh)和 C shell(csh),其中Bourne shell(sh)已经被

bash shell 取代

查看当前系统支持的shell 类型,命令是:cat /etc/shells

shell脚本学习,常用脚本练习实战(一)_第4张图片

其中前三个我们比较常用,bash 比sh功能强大

文件测试表达式(我们操作问价前,要判断文件是否存在)文件命令的 参数详解

shell脚本学习,常用脚本练习实战(一)_第5张图片

如果我们忘记上述参数有什么用,我们可以用man test 命令查看,不停的回车,直到出现end ,我们man test 命令可以看很多比比较的 命令的用法

linux中man 命令的作用(这个命令很有用,我们可以用来查看 其他命令参数的作用,比如man cp ,我们就可以知道cp 命令参数的作用和功能,可能只会展示一部分,我们按回车键,可以继续展示,知道下方出现end ,我们q 就可以退出,很有用)

比如我当前目录下有一个1.sh 文件,我看看是否是可执行文件,如果是输出为1,不是输出为0

值得注意的是我们 给一个变量名赋值问系统文件的路径, 我们判断的是文件,不是判断的字符串

(这里提一下linux 命令中声明变量的问题:

变量名=变量值 , 注意=左右不能有空格,使用$变量名调用变量

使用set命令可以查看所有变量,包括普通变量和环境变量,删除变量名:使用unset变量名即可

我们接下来创建一个脚本,写一个测试

输入 ,这里$1 表示我们执行脚本的第一个参数 ,后面的大括号 中的命令是要给整体,

第一个参数是3 ,我们就执行后面的 命令

然后我们测试(如果测试脚本没有成功,记得看是不是 脚本没有执行的权限,添加执行权限)

常用的字符串后面参数详解

shell脚本学习,常用脚本练习实战(一)_第6张图片

字符串不为0

整数比较的 常用的命令

shell脚本学习,常用脚本练习实战(一)_第7张图片

 如果我们要[] 中使用> 表示大于 我们要用转义符,< 同理

shell脚本学习,常用脚本练习实战(一)_第8张图片

shell脚本学习,常用脚本练习实战(一)_第9张图片

练习两个整数比较大小,用三种方法,1脚本传参,2 用read 方法, 3 定义变量的方式

#!/bin/sh
#传参的方式,如果传入的参数不等与两个
[ $# -ne 2 ]&& {
    echo "USAGE:num1 num2"
    exit 1
}

#然后判断两个数是否是整数
[ "`echo "$1"|sed -r 's#[^0-9]##g'`" = "$1" ] || {
    echo "first arg must be int."
    exit 2
}

[ "`echo "$2"|sed -r 's#[^0-9]##g'`" = "$2" ] || {
    echo "first arg must be int."
    exit 2
}

[ $1 -lt $2 ] && {
    echo "$1 < $2"
    exit 0
}

[ $1 -eq $2 ] && {
    echo "$1 = $2"
    exit 0
}

[ $1 -gt $2 ] && {
    echo "$1 < $2"
    exit 0
}

sed 命令 参考这个 博客https://www.cnblogs.com/wangqiguo/p/6718512.html

sed命令实例:判断是否是 是整数

这个命令的作用是: 判断是否全是数字,如果不是则输出为0,是输出为1 ,sed 是一个流编辑器,利用正则,将输入的123中非数字的替换为空,这样 与原来的比较如果相同就是 输入的是整数

用read方法来读取判断你是否输入的是整数

#!/bin/sh
read -p "pls input two num:" num1 num2

#传参的方式,如果传入的参数不等与两个
[ $# -ne 2 ]&& {
    echo "USAGE:num1 num2"
    exit 1
}

#然后判断两个数是否是整数
[ "`echo "$1"|sed -r 's#[^0-9]##g'`" = "$1" ] || {
    echo "first arg must be int."
    exit 2
}

[ "`echo "$2"|sed -r 's#[^0-9]##g'`" = "$2" ] || {
    echo "first arg must be int."
    exit 2
}

[ $1 -lt $2 ] && {
    echo "$1 < $2"
    exit 0
}

[ $1 -eq $2 ] && {
    echo "$1 = $2"
    exit 0
}

[ $1 -gt $2 ] && {
    echo "$1 < $2"
    exit 0
}
 

(插播一个命令:我们在vim 下,想用替换 在命令模式下 输入   :%#原字符串#新字符串#g      ,就可以将所有的字符都替换掉)

read 的方式去判断

#!/bin/sh
  2 read -p "pls input two num:" num1 num2
  3 a=$num1
  4 b=$num2
  5 
  6 [ -z "$a" -o -z "$b" ] && {
  7     echo "USAGE: num1 num2"
  8     exit 1
  9 }
 10 #传参的方式,如果传入的参数不等与两个
 11 
 12 
 13 #然后判断两个数是否是整数
 14 [ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ] || {
 15     echo "first arg must be int."
 16     exit 2
 17 }
 18 
 19 [ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ] || {
 20     echo "first arg must be int."
 21     exit 2
 22 }
 23 
 24 [ $a -lt $b ] && {
 25     echo "$a < $b"
 26     exit 0
 27 }
 28 
 29 [ $a -eq $b ] && {
 30     echo "$a = $b"
 31     exit 0
 32 }
 33 
 34 [ $a -gt $b ] && {
 35     echo "$a < $b"
 36     exit 0
 37 }

单的脚本,根据输入的参数打印出不同的结果:

#!/bin/sh
menu() {
cat <

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

首先先写一个发邮件的脚本(发送邮件,首先你要获得root权限,详细看https://blog.csdn.net/zh314js/article/details/76038868)

 #!/bin/sh
  2 cur_free=`free -m|grep buffers\/|awk '{print $NF}'`   #nf输出分割的最后一段
  3 chars="current memory is $cur_free."
  4 echo "$cur_free"
  5 if [ $cur_free -lt 100 ] #当内存小于100M
  6         then
  7             echo "现在的内存是:$cur_free"| mail -s "$chars" [email protected]   #现在内存是$cur_free是  邮件的内容, -s 后面是邮件的title
  8 fi
  9 
~              

我们假设这个脚本名称是memorymontor.sh

然后我们执行定时任务

crontab -l

*/3 * * * * memorymontor.sh >/dev/null 2>$1 #每三分钟执行一次,脚本,标准输入丢弃,错误输出流 重新定向到了标准输出,而标准输出 丢弃了,所以标准输入输出都丢弃了

监控web服务是否正常和监控db服务是否正常,不低于5中思路

共同的方法有:

利用端口   

1、本地的用命令:netstat /ss/lsof         (比如netstat -lnp|grep 端口号,ss -lnp | grep 端口  ,lsof -i:端口)

远程的命令:telnet/nmap/nc

ss命令(参考博客http://www.cnblogs.com/sparkdev/p/8421897.html)

2、利用进程(本地)ps -ef | prep 端口或对应的程序

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

3、利用wget/curl(http方式,判断根据返回值或者返回的内容,有时候进程存在,但是防火墙挡住了,也有问题)

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

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

用三种方法,监控db服务是否开启

#!/bin/sh
   #判断mysql服务是否开启的常用几种等价的方法
   if [ "`netstat -lnt | grep 3306 |awk -F "[ :]" '{print $4}'`" = "3306" ]
   # if [ `netstat -lnt |grep 3306 |awk -F "[ :]+" '{print $4}'` -eq 3306 ] 是错误的,因为由于当没有启动mysql ,就成了null 与 3306比较,报错,用= 是因为用了双引号,是两个字符串之间的比较
   #if [ `ps -ef | grep mysql | grep -v grep |wc -l' -gt 0 ]
   #这里的ip 是数据库的服务器ip
   #if [ `nc -w 2  10.0.0.7 3306 &>/dev/null&&echo ok |wc -l` -gt 0 ] #nc用于看是否看防了对应的端口
   #if [ `namp 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]  ##!/bin/sh
   #判断mysql服务是否开启的常用几种等价的方法
   if [ "`netstat -lnt | grep 3306 |awk -F "[ :]" '{print $4}'`" = "3306" ]
   # if [ `netstat -lnt |grep 3306 |awk -F "[ :]+" '{print $4}'` -eq 3306 ] 是错误的,因为由于当没有启动mysql ,就成了null 与 3306比较,报错,用= 是因为用了双引号,是两个字符串之间的比较
   #if [ `ps -ef | grep mysql | grep -v grep |wc -l' -gt 0 ]
   #这里的ip 是数据库的服务器ip
   #if [ `nc -w 2  10.0.0.7 3306 &>/dev/null&&echo ok |wc -l` -gt 0 ] #nc用于看是否开放了对应的端口
   #if [ `namp 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]
   #if[ `lsof -i tcp:3306|wc -l` -gt 0 ]
      then
          echo "MYSQL is Running"
      else
          echo "MYSQL is Stopped"
  fi
   #if[ `lsof -i tcp:3306|wc -l` -gt 0 ]
      then
          echo "MYSQL is Running"
      else
          echo "MYSQL is Stopped"
  fi
!/bin/sh
if [ `curl -I http://10.0.0.52 2>/dev/null 

shell脚本学习,常用脚本练习实战(一)_第10张图片

 

你可能感兴趣的:(shell)