shell脚本的执行方法:
用 vi 打开 test.sh,编写:
vi test.sh
#!/bin/bash
echo "Hello world!" #第一行指定解释器,第二行打印 Hello world! 写好后,开始执行。
执行 Shell 脚本有三种方法:
方法1 :直接用bash解释器执行
sh test.sh
方法2 :给脚本执行权限
chmod +x test.sh
./test.sh
方法3 : source 命令执行,以当前默认shell解释器执行
source test.sh
shell能做什么:
1 安装操作系统 2 系统基础配置 (主机名、系统更新、仓库、SSH优化) 3 部署应用服务 (Nginx、PHP、MySQL、Zabbix....) 4 配置应用服务 (Ansible/Shell Nginx Conf) 5 部署业务代码 (Shell完成部署/git+jenkins) 6 应用服务备份 (系统配置备份、数据的备份、数据库的备份---> Shell-->Crond) 7 日志的分析 (Shell数组) 8 监控应用服务 (Zabbix + Shell(采集对应服务器自身的状态信息) ) 9 自动化扩容/缩容:监控服务主机平均的CPU达到80%->触发->执行命令( shell | 脚本 ) 10 扩容: 调用api购买云主机->完成初始化操作->部署服务->部署代码->加入集群->变更负载均衡配置->对外提供 11 监控主机->当cpu5%->则触发动作->脚本 12 缩容:比对初始设定的阈值->判断要处理的主机->通过api删除主机->变更负载均衡配置->对外提供服务 13 Shell什么都能干,取决于具体的需求和实际的业务。
shell涉及的内容:
1.变量
2.条件判断 if elese
3.循环 for while
4.流程控制 case
5.shell函数 function
6.Shell数组 array
7.shell正则、sed、awk
预先定义变量:
$0脚本文件名
$*所有的参数
$@所有的参数
$#参数的个数
$$当前进程的 PID
$!上一个后台进程的 PID
$?上一个命令的返回值 0表示成功
Shell脚本的特性:
1.命令补全和文件路径补全, 如果写错无法补全 table 2.命令历史记忆功能 history 3.别名功能 alias、unalias 4.常用快捷键 ctrl+u,k,a,e,l,c,z,d,w,r,y 5.前后台作业控制 bg,fg,jobs,screen 6.输入输出重定向 >,>>,1>,2>>,&>,cat < 7.管道 |将前者命令的标准输出交给后者命令的输入 tee 8.命令排序 ; 没有逻辑关系,无论分号前面的命令执行是否成功都执行后者命令 && 前面执行成功, 则执行后者 || 前面执行不成功, 则执行后者 9.shell 通配符 * 匹配任意多个字符 ? 匹配任意一个字符 [] 匹配括号中任意一个字符a-z,0-9,A-Z,a-Z () 在子 shell 中执行(cd /boot;ls) (umask 077; touch file1000) {} 集合 touch file{1..9} 转义符 10.echo输出颜色、printf 格式化输出文本(多用于一些报警信息的字体颜色,看起来更醒目,别的没有太多实际用途) [root@Shell ~]# echo -e " 33[30m 黑色字 33[0m" [root@Shell ~]# echo -e " 33[31m 红色字 33[0m" [root@Shell ~]# echo -e " 33[32m 绿色字 33[0m" [root@Shell ~]# echo -e " 33[33m 黄色字 33[0m" [root@Shell ~]# echo -e " 33[34m 蓝色字 33[0m" [root@Shell ~]# echo -e " 33[35m 紫色字 33[0m" [root@Shell ~]# echo -e " 33[36m 天蓝字 33[0m" [root@Shell ~]# echo -e " 33[37m 白色字 33[0m"
变量赋值方式:
read 从键盘读入变量值
echo -n 让用户直接在后面输入
//实例
1 #!/bin/bash 2 3 read -p "input ip: " ip # read -p “提示信息:” 变量名(指定多个变量) 4 ping -c2 $ip &>/dev/null # -c 数目:在发送指定数目的包后停止。 5 if [ $? -eq 0 ];then 6 echo "host $ip is ok" 7 else 8 echo "host $ip is err" 9 fi
超时,等待输入的秒数(read -t)
1 #!/bin/bash 2 # timing the data entry 3 4 if read -t 5 -p "Please enter your name: " name #记得加-p参数, 直接在read命令行指定提示符 5 then 6 echo "Hello $name, welcome to my script" 7 else 8 echo "Sorry, too slow!" 9 fi 10 11 # ./read3.sh 12 Please enter your name: #不输入任何数据,测试 13 Sorry, too slow! 14 # ./read3.sh 15 Please enter your name: wang #输入数据测试 16 Hello wang, welcome to my script
条件测试-->文件测试:
格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: [[ 条件表达式 ]]
[ -e dir|file ] [ -d dir ] 是否存在,而且是目录 [ -f file ] 文件是否存在 [ -r file ] 是否拥有读权限 [ -x file ] 是否拥有执行权限 [ -w file ] 是否拥有写权限
1.常见使用方式
[ ! -d /bbb ] && mkdir /test
[ -d /bbb ] || mkdir /test
脚本使用方式
#!/usr/bin/bash #定义备份目录站点 back_dir=/var/mysql_back # test -d $back_dir || mkdir -p $back_dir if [ ! -d $back_dir ];then mkdir -p $back_dir fi echo "开始备份..."
数值比较
数值比较 [ 整数 1 操作符 整数 2 ]
[ 1 -gt 10 ] 大于 [ 1 -lt 10 ] 小于 [ 1 -eq 10 ] 等于 [ 1 -ne 10 ] 不等于 [ 1 -ge 10 ] 大于等于 [ 1 -le 10 ] 小于等于
1.条件测试, 脚本使用案例, 创建用户【交互式创建】
1.怎么交互式 read -p
2.接收到对应字符串怎么创建用户 useradd
3.用户是否存在,如果存在则不执行,如果不存在则执行
#!/usr/bin/bash read -p "Please input a username: " user id $user &>/dev/null if [ $? -eq 0 ]; then echo "user $user already exists" else useradd $user if [ $? -eq 0 ];then echo "$user is created." fi fi
脚本书写思路与练习:
1.查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
1.获取磁盘当前使用的值 df -h|grep /$
2.从获取到的值中提取出,对应的使用率 df -h|grep /$|awk -F "[ %]+" '{print $(NF-1)}'
3.进行数字比较(如果提取出来的值大于80则报警,如果提取出来的值小于80则不处理)
#!/usr/bin/bash Disk=$(df -h|grep /$|awk -F "[ %]+" '{print $(NF-1)}') if [ $Disk -gt 80 ];then echo "磁盘使用率超标, 当前使用率是: ${Disk}%" else echo "磁盘啥事没有!!当前使用率是: ${Disk}%" fi
2.查看内存/当前使用状态,如果使用率超过80%则报警发邮件
1.如何查看内存的总大小 free -m|awk '/^Mem/{print $2}'
2.如何查看内存的使用率 free -m|awk '/^Mem/{print $3}'
3.使用使用率*100 除以 内存的总大小 = 使用的百分比
4.拿到对应的百分比进行比对。
[root@web03 day01]# cat free_use.sh #!/usr/bin/bash Free_use=$(free -m|awk '/^Mem/{print int($3/$2*100)}') if [ $Free_use -gt 10 ];then echo "内存使用率超标了, 当前内存的使用率是: ${Free_use}%" else echo "内存使用率正常, 当前内存的使用率是: ${Free_use}%" fi
[root@bgx]# cat mem.sh Mem_Total=$(free -m|grep "^M"|awk '{print $2}') Mem_Use=$(free -m|grep "^M"|awk '{print $3}') Mem_B=$((($Mem_Use*100)/$Mem_Total)) if [ $Mem_B -ge 30 ];then echo "Memory Is Err ${Mem_B}%" else echo "Memory Is OK ${Mem_B}%" fi