shell脚本基础->

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
原文地址:https://www.cnblogs.com/tim1blog/p/9673164.html