zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    MYSQL索引
    Objective-C:KVO
    iOS UIKit:viewController之动画(5)
    iOS UIKit:viewController之Segues (4)
    iOS UIKit:viewController之Present (3)
    iOS UIKit:viewController之定义(2)
    iOS UIKit:viewController之层次结构(1)
    iOS UIKit:view
    iOS UIKit:App
    Objective-C:Block
  • 原文地址:https://www.cnblogs.com/tim1blog/p/9673164.html
Copyright © 2011-2022 走看看