导语:
shell 就是一个用户跟操作系统之间的一个命令解释器。Linux Shell 种类非常多,不同的 Shell 语言的语法有所不同,所以不能交换使用。最常用的 shell 是 Bash,也就是 Bourne Again Shell ,由于易用和免费,不同的 Shell 语言的语法有所不同,所以不能交换使用。
好记性不如烂笔头,特作总结!
1.第一个程序:helloworld.sh
#!/bin/bash // 表示定义该脚本是一个 shell 脚本(固定格式)。
#This is my First shell // 这里的#号属于注解,没有任何的意义,SHELL不会解析它。
echo “Hello World ! ” //shell 脚本主命令,我们执行这个脚本讲看到 : Hello World ! 信息。
赋予执行权限:
chmod o+x first_shell.sh 然后./first_shell.sh 执行即可 ; 也可以直接使用命令执行 : /bin/sh first_shell.sh ,显示效果一样
2.变量
(1)赋值=
SHELL变量可分为两类:局部变量和环境变量
局部变量只在创建它们的 shell 脚本中使用。而环境变量则可以在创建它们的 shell及其派生出来的任意子进程中使用。 有些变量是用户创建的, 其他的则是专用 shell 变量。
例如在脚本里面定义 A=123 , 定义这样一个变量,前面变量名,后面是变量的值。
SHELL常见的系统变量解析 :
$0 当前程序的名称
$n 当前程序的第 n 个参数 ,n=1,2, , 9
$* 当前程序的所有参数 ( 不包括程序本身 )
$# 当前程序的参数个数 ( 不包括程序本身 )
$? 命令或程序执行完后的状态,一般返回 0 表示执行成功。
$UID 当前用户的 ID
$PWD 当前所在的目录
文字颜色设定:echo -e '\033[32m--*#?--\033[0m'
3.shell编程---流程控制 4 大剑客: if 、for 、while 、case(略)
(1)if应用
一,测试数字大小:&获取变量的地址
二,测试目录是否存在,不存在则新建;注意,中括号之间必须要空格
逻辑运算符解析: -f 判断文件是否存在 eg: if [ -f filename ] -d 判断目录是否存在 eg: if [ -d dir ] -eq 等于 应用于:整型比较 -ne 不等于 应用于:整型比较 -lt 小于 应用于:整型比较 -gt 大于 应用于:整型比较 -le 小于或等于 应用于:整型比较 -ge 大于或等于 应用于:整型比较 -a 双方都成立( and) 逻辑表达式 –a 逻辑表达式 -o 单方成立( or) 逻辑表达式 –o 逻辑表达式 -z 空字符 |
三,多个条件测试判断
4.shell编程 文本操作 4大金刚-sed,awk,Find,Grep
四大“金刚”对shell编程,可称之为左膀右臂;帮助很大
+++++++++++++sed--依照脚本的指令来处理、编辑文本文件+++++++++++++++++++++++++++++++
替换关键字
行头填充操作
插入操作
打印具体行
sed 应用实例-最最大和最小数据
++++grep--是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行++++++++++
Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR
匹配关键字
匹配头尾
匹配特征字
grep 实例---查ip--cat test.log |grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
grep-应用
++++++awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大+++
按符号分列-并筛选出具体列
案例-打印Linux中的ip信息-练习awk
打印磁盘大小--awk第五列
打印任何一列的参数:
awk-BEGIN的使用
awk 'BEGIN{OFS=FS=":"} #将输出和输入分隔符设置为冒号
NR==FNR{a[$1]=$2} #NR=FNR表示读取第一个文件的每行时,a[$1]=$2"表示设置一个数组元素a[行的首列]=行第二列
NR>FNR{$2=a[$1]; #"NR>FNR"当然就表示读取第二个文件(2.txt)每行时,将该行的第二列替换为之前建立的数组中对应的元素
print
}' 1.txt 2.txt
用例:开发系统监控脚本
■ 企业环境说明
● 某公司随着业务的不断发展,所使用的Linux服务器也越来越多。管理员希望编写一个简单的性能监控脚本,放到各服务器中,当监控指标出现异常时发送告警邮件
■ 需求描述
● 编写名为sysmon.sh的Shell|监控脚本
● 监控内容包括CPU使用率、内存使用率、根分区的磁盘占用率
● 百分比只需精确到个位,如7%、 12%、23%等
● 出现以下任一-情况时告警:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%,告警邮件通过mail命令发送到指定邮箱
● 结合crond服务,每半小时执行一次监控脚本
■ 脚本编程
● 磁盘占有率
[root@client1 ~]# df -Th| grep ' /$'
[root@client1 ~]# df -Th | grep '/$'| awk '{print $6}
[root@client1 ~]# df -Th| grep '/$'| awk '{print $6}' | awk -F% '{print $1} '
[root@client1 ~]# disk=$(df -Th | grep '/$ ' | awk ' {print $6}'| awk -F% ' {print $1}')
● CPU使用率
[rootaclient1 ~]# mpstat
[root@client1 ~]# mpstat| tail -1| awk '{print $12}'
[root@client1 ~]# mpstat| tail -1| awk '{print $12}'| awk -F. '{print $1}
[root@client1 ~]# expr 100 - $ (mpstat| tail -1| awk -F. '{print $1}')
[root@client1 ~]# CPU=$(expr 100 - $ (mpstat| tail -1| awk ' {print $12}' | awk -F. '{print $1}'))
● 内存使用率
[root@client1~]# free -m
[root@client1~]# free -m | grep "Mem:" | awk '{print $7}'
[root@client1~]# free -m | grep "Mem:" | awk ' {print $2} '
[root@client1 ~]# expr $(free -m| grep "Mem:"| awk ' {print $7}') / $(free -m| grep "Mem :" |awk '{print $2}')
[root@client1 ~]# expr $(free -m| grep "Mem:"| awk ' {print $7}') \* 100 / $(free -m | grep "Men:" | awk '{print $2}')
mem=$(expr $(free -m| grep "Mem: " | awk ' {print $7}') \* 100 / $(free -m | grep "Men:" | awk '{print $2}'))
● 配置文件
[root@client1~]# rpm -qa mailx
mailx-12.5-16.el7.x86 64
[root@client1 ~]# vi /etc/mail.rc
[root@client1 ~]# echo” 122333"| mail -S "test" ***********
set from********* @qq.com // 发送邮箱地址
set smtp=smtp.qq.com // 邮箱使用的smtp服务器的域名
set smtp - auth -user=*********@qq.com
set smtp- auth -password........ // 获取授权码
set smtp -auth=login // smtp的状态,登录状态
● 编辑配置告警脚本
[root@client1 ~]# vim sys. sh
[root@client1 ~]# chmod +x sys. sh
[root@client1 ~]# ./ sys. sh
#!/bin/bash
# 磁盘占有率超过90%,CPU使用率超过80%,内存使用率超过90%告警发送邮件
disk=$(df -Th | grep '/$' | awk '{print $6}' | awk -F% '{print $1}')
CPU=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mem=$(expr $(free -m | grep "Mem:" | awk '{print $7}') \* 100 / $(free -m | grep "Mem:" | awk '{print $2}'))
A=/root/alert.txt
B=*************@qq.com
if[ $disk -ge 90 ]
then echo "磁盘占有率超过90%" >> $A
fi
if[ $CPU -ge 80 ]
then echo "CPU使用率超过80%" >> $A
fi
if[ $mem -ge 90 ]
then echo "内存使用率超过90%" >> $A
fi
if[ -f $A ]
then
cat $A | mail -s "alert report" $B
rm -rf $A
fi