两天入门shell(第一天)-基础知识和代码练习

两天入门shell-编写服务器监控脚本-发邮件通知

这是新年领导交给我的第一份任务,让我尽快写出一个shell脚本来监控服务器状态,在出现异常的时候,能第一时间给我的邮箱发邮件来通知我。

现在我就记录一下我两天是如何写出这样一套监控脚本的。

我对shell是零基础的,目前只会一些基础的linux命令,只能够实现简单的服务器部署。上头交代了任务,我就硬着头皮现学现用咯。

实现目标:

  1. 监控apache web服务
  2. 监控mysql数据库
  3. 监控服务器连接状态(能否正常请求接口)
  4. 监控某个重要接口的状态
  5. 监控服务器的内存使用
  6. 监控服务器硬盘使用情况

两天实现的目标有点庞大,从基础知识一点一点来。

一、shell是什么

Linux系统的shell作为操作系统的外壳,为用户提供了使用操作系统的接口。
它是命令语言、命令解释程序以及程序设计语言的统称,
负责用户和操作系统之间的沟通,把用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户。
所以,shell不仅可看作用户环境,也可称为命令解释器。

二、shell基础

1. 了解shell的基本概念

shell分为交互式和非交互式。
交互式,指命令行输入,然后执行,这是需要和用户交互的。
非交互式,指读取文件中的命令执行,例如执行脚本。

shell实际上是一种编程语言。

shell有很多种,Korn shell比较接近一般程序设计语言,具有子程序的功能,提供了较多的数据类型。

Bourne shell数据类型较少,只有字符串和布尔类型。

shell的两种主要语法类型有Bourne和C,这两种类型互不兼容。
Bourne家族有:sh、ksh、Bash、psh、zsh;
C家族有:csh、tcsh。

整体测试下,ksh表现较佳,其次是csh和sh。
如果考虑速度的话,应该使用sh。因为是基本的shell,所以运行速度很快。

Linux领域最常见的shell是bash(Bourne Again shell)。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,那么shell就是围绕内核的外层。

2. shell使用基础

进入和退出shell
进入shell
(1)终端进入。
进入Linux桌面环境之后,选择【应用程序】|【附件】|【终端】启动shell。
(2)虚拟控制台进入
默认情况下,Linux有六个虚拟控制台,分别是tty1~tty6。
使用root登录之后,进入/etc/inittab文件,找到语句“id:5:initdefault:”,将5改成3。重新启动后,再登录进去就是虚拟控制台登录界面。按Alt+F2,切换到tty2,如果要退回到控制台tty1,按Alt+F1。

退出shell,执行exit命令。

查看linux支持的shell
vi /etc/shells
这里写图片描述
shell命令行
(1)shell模式匹配支持
这里写图片描述
“$”有两个不同的含义:表达式中的单个字符模式匹配和脚本中的变量赋值。

其他通配符
这里写图片描述

(2)输入输出
a.标准输入输出
键盘——标准输入——/dev/stdin
显示器——标准输出——/dev/sdtout
显示器——标准错误输出——/dev/sdterr

b.重定向输入和输出

命令行使用输入和输出重定向可以创建文件、重写文件或者向文件追加数据。

适合无人值守时开启定时任务,命令运行的输出结果可以写到日志文件里,方便后期查看。

重定向输入输出(之后有部分篇幅参考慕课网课程Linux达人养成计划I)
这里写图片描述

输入重定向 示例
wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
例如 wc -l test.log
wc < test.log 不加<也能统计
wc << ddy 可以一直输入,直到输入ddy的时候统计所有的字节

(3)常用命令
这里写图片描述

(4)修改别名
运行alias 能看到每个命令的别名。
修改目录显示的颜色(蓝色很不明显)
ls –color=never /
只执行这一行的话,每次虚拟机重启,目录颜色还是蓝色。
运行
alias ls=’ls –color=never’

(5)别名永久生效和删除别名
vi /root/.bashrc : 写入环境变量配置文件,需要重启生效,用命令source .bashrc也可以生效。
unalias [别名] : 删除别名,这个也是临时删除,需要打开文件,删掉别名那一行

再运行alias,就能发现ls的别名被修改了,再查看目录的时候,目录颜色就会变成白色了。

(6)常用快捷键
这里写图片描述

(7)历史命令
history [选项] [历史命令保存文件]
选项:
-c :清空历史命令
-w :把缓存中的历史命令写入历史命令保存文件 ~/.bash_history

打开.bash_history看到的是虚拟机上次关机时保存的命令,而用history命令,能够看到之前和当前最新的命令。

历史命令调用
a.使用上下箭头调用以前的命令
b.使用“!n”执行第n条历史命令
c.使用“!!”执行上一条命令
d.使用“!字符串”执行该字符串开头的最后一条命令

(8)管道符
多命令顺序执行
这里写图片描述

管道符命令格式:
命令1 | 命令2
命令1的正确输出作为命令2的操作对象。
需要注意的是,命令2必要能执行命令1的输出,命令2要严格。

比如:ls -l /home | more

查看当前连接到服务器的用户数量:
netstat -an | grep ESTABLISHED | wc -l

3. 掌握shell程序的基本语法
(1)shell的用户变量
shell与其他编程的主要区别:shell的变量没有类型。

声明变量:aa=fish
变量只读性:readonly aa
引用变量值 ${aa}

用{}可以实现字符串合并
如echo ${aa}day
输出fishday

变量名规范:由字母字母和下划线组成,变量名不能以数字开头。

声明多个变量,用空格分开。
如:aa=fish bb=cat

变量的条件替换
第一种:{variable:-value}不替换默认值
这里写图片描述
第二种:{variable:=value}替换默认值
这里写图片描述

(2)shell的环境变量和内部变量
环境变量和内部变量都是shell定义好了的。类似于java中的关键词。

说说内部变量,这个可能用到。
这里写图片描述

(3)位置参数
上一个示例从命令行传参数的到程序,如果在程序里取参,可以这么写一段程序参考。

#program param.sh
if[ $# -eq 0 ]
then
echo "no param"
else
echo "param 1 is "$1
echo "param 2 is "$2
fi

命令行输入bash param.sh fish cat
打印
param 1 is fish
param 2 is cat

(4)变量表达式
a.字符串比较
这里写图片描述
示例代码

#!/bin/sh
str1=opt
str2=opr

if [ $str1 = $str2 ]
then 
    echo "str1 equal to str2"
else 
    echo "str1 not equal to str2"
fi

if [ $str1 != $str2 ]
then 
    echo "str1 not equal to str2"
else
    echo "str1 equal to str2 "
fi

if [ $str1 ]
then 
    echo "str1 is not empty"
else 
    echo "str1 is empty"
fi

if [ -n $str1 ]
then 
    echo "str1 length greater than 0"
else 
    echo "str1 length equal to 0"
fi

if [ -z $str2 ]
then
    echo "str2 length is equal to 0"
else
    echo "str2 length greater than 0"
fi

运行结果:
这里写图片描述
b.数值比较
这里写图片描述
示例代码

1
2

运行结果:
这里写图片描述

c.文件操作
这里写图片描述

示例代码
1
这里写图片描述

运行结果如下:
这里写图片描述

d.逻辑操作
这里写图片描述
4. 学会应用shell的控制结构语句
(1)循环语句
a. for语句

  • 语法形式1:
    对list中的每个对象都执行操作。
for curvar in list
do
    statements(执行语句)
done
  • 语法形式2:
    对传递给shell程序的每个位置参数都执行一次。
for curvar
do 
    statements(执行语句)
done    

相当于:

for curvar in $@
do 
    statements(执行语句)
done

$@是传递给shell程序的位置参数列表。

  • 语法形式3:
for var in one two three four five
do 
    statements(执行语句)
done

这个程序的for语句,先定义了一个var的变量,它的值依次是one、 two、 three 、four、 five。这五个变量值都会依次执行。

示例代码:
这里写图片描述
执行语句:bash test1.sh fish cat
执行结果:
这里写图片描述

b. while语句
指定条件为真时,才执行语句。
语法形式:

while 条件
do 
    执行语句
done

示例代码:
这里写图片描述
注意语句result=’expr $result + $num‘,这里用的而是反引号,而不是单引号。反引号是tab键上方的那个键。
运行结果:
这里写图片描述
c. until语句
执行一系列语句直到指定条件为真。
语法形式:

until 条件
do
    执行语句
done

和while的区别:while条件成立时执行,不成立时停止;而until条件不成立时执行,成立时停止。

示例:
这里写图片描述
执行结果:
这里写图片描述

d. shift语句
shift语句用于处理位置参数,一次一个从左到右处理。
shift命令的作用是使每个位置参数向左移动一个位置,当前的$1参数丢弃。
语法形式:

shift number

number指需要移动的位置数,如果没有number,默认为1。
代码示例
这里写图片描述
执行结果:
这里写图片描述

(2)条件语句
a. if语句

  • 语法形式:
if [条件]
then
    执行语句
elif [条件] 
then
    执行语句
else
    执行语句
fi

b. case语句
- 语法形式:

case str in
    str1 | str2)
        statements;;
    str3 | str4)
        statements;;
    *)
        statements;;
esac

这里要注意的是:
当字符串和某个值相同时执行后面的语句;
当同一个操作有多个值时,用分隔符“|”将各个值分开;
双引号作为该条件的执行结束标志;
最后一个条件必须为*,代表其他条件。
示例代码:
这里写图片描述
执行结果:
这里写图片描述

c. break和continue

break——立即终止当前循环的执行;
语法:break [n] —— n表示跳出几层循环,默认为1。

continue——立即开始下一个循环的执行;
语法:continue [n] —— n表示从包含continue的最内层循环往外跳到第几层循环,默认为1。

5. 学会在shell程序中使用函数
函数语法格式:

  • 语法格式1:
函数名() {
    语句
}
  • 语法格式2:
函数名() 
{
    语句
}
  • 语法格式3:
function 函数名() 
{
    语句
}

示例代码:

这里写图片描述

执行结果:
这里写图片描述

三、实现第一个shell脚本

进入到linux /home目录下新建一个文件夹shell-test
在这个文件夹下新建一个hello.sh文件

mkdir hello.sh

(1)打开文件
vim hello.sh

(2)编写脚本

#!/bin/bash
#this is the first shell script

echo -e "\t Hello! \n This is the first!!"

“#”标识注释行,但是#!/bin/bash不是注释的意思,而是声明这是用bash运行

(3)脚本执行
赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
通过Bash调用执行脚本
bash hello.sh

猜你喜欢

转载自blog.csdn.net/misseel/article/details/79358901
今日推荐