美文网首页
Shell第一天

Shell第一天

作者: 杨小倪 | 来源:发表于2019-10-29 08:31 被阅读0次

    Shell第一天

    1.什么是shell?

    shell是一个命令解释器,将输入的命令解释给内核,在将内核返回的信息输出值屏幕
    
    当然shell命令是存在交互式、非交互式两种方式。
    交互式,其实在我们日常生活中,使用最多的一种模式、登陆终端、执行命令、返回结果。再次输入命令、然后等待结果,最后工作结束退出shell会话,当退出shell会话后,当前的shell会话也就终止了。
    
    非交互式:在这种模式下,shell不与你进行交互,而是直接读取某个文件进行执行。那文件中都有什么,其实,就是一堆的命令。当文件从头执行到尾,结束时,当前shell也终止了。
    

    2.什么是shell脚本

    1.将系统命令堆积到一起,顺序执行(简称 系统命令堆积)
    2.特定的格式 + 特定的语法 + 系统命令 = 文件
    

    3.shell能做什么

    1.基础配置:系统初始化操作、系统更新、内核调整、网络、时区、SSH优化
    2.安装程序:部署LNMP、LNMT、MySQL、nginx、redis、elk等
    3.配置变更:Nginx conf、PHP Conf、MySQL Conf、Redis Conf
    4.业务部署:Shell配合git、jenkins实现自动化部署php、java代码,以及代码回滚
    5.日常备份:使用shell脚本对MySQL进行每晚的全量与增量备份
    6.信息采集:Zabbix + shell,硬件、系统、服务、网络、等等
    7.日志分析:取值->排序->去重->统计->分析
    8.服务扩容:扩容,监控服务器集群cpu,如果负载持续80% + 触发动作(脚本);脚本调用api开通云主机->初始化环境->加入集群->对外提供
    9.服务缩容:监控服务器集群cpu使用率--低于20%-->检测当前有多少web节点--判断是否超过预设定--缩减至预设定状态--变更负载配置
    
    PS:Shell脚本的主要作用是简化操作步骤,提高效率,减少人为干预,减少系统故障
    
    
    ps:
        1.安装方式一致
        2.安装路径一直
        3.目录结构一致
        4.日志格式一致
        5.脚本路径一致
    
    

    4.学习shell脚本需要的预备知识

    1.需要的预备知识
        1.熟练使用vim编辑器
        2.熟练使用linux命令
        3.熟练使用三剑客
    2.如何才能学好shell脚本
        1.基础命令+基础服务+练习+思路 (必备)
        2.能看懂shell脚本+能修改shell脚本+编写shell脚本+优化脚本
    
    

    5.shell脚本的书写方式

    1.shell脚本命名

    名字要有意义,不要使用abcd123这种方式命名;虽然说Linux系统中,文件没有名字的概念,依然建议你使用 。sh结尾,名字不要太长,最好是能在30个字节内解决
    
    

    2.shell脚本格式

    脚本开头必须指定脚本运行环境 ,以#!这个特殊符号组合组成例如: #!/usr/bin/bash
    

    3.shell脚本里面 # 的应用

    #   注释,主要是用来描绘我们的shell脚本使用的方式
    

    6.shell脚本执行方式

    1.当我们给脚本加上执行权限之后,可以 . / 运行

    2.如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予权限的脚本

    !/usr/bin/bash 驾驭不加的区别

    1.如果你明确清除这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响

    2.如果你不清楚是什么类型的脚本,直接而是用 . / 执行,那么会读取该脚本的指定的解释器,如果没有指定,那么默认会使用bash翻译

    书写方式

    !/usr/bin/bash

    !/usr/bin/sh

    !/usr/bin/env bash

    !/usr/bin/env python

    PS: env会主动寻找命令解释器所在的路径

    本章课程

    1. 什么是变量variables?

    变量是shell 中传递数据的一种方法。

    简单理解,变量就是用一个固定的字符串,去表示一个不固定的值。

    2.变量的规范

    1.大写开头,后面小写或数字都ok

    2.变量具有一定的含义

    3.白能量的写法 A=1 等于不能有空格

    2.Shell变量定义

    1.变量定义方式

    1.用户自定义变量:认为定义变量名与变量的值
    2.系统环境变量:保存的是和系统操作环境相关的数据,所有用户都可以使用
    3.位置参数变量:像脚本中进行参数传递,变量名不能自定义,变量作用是固定的
    4.预定义的变量:是Bash中已定义好的变量,变量名不能自定义,变量的作用也是固定的。
    

    2.用户自定义变量实例,当前shell有用

    export 可以将自定义变量转换为全局变量

    3.预先定义的变量参数实例,系统内置变量

    $0      当前shell脚本的文件名
    $1      第一个shell脚本位置参数
    $2      第二个shell脚本位置参数
    $3      第三个shell脚本位置参数  
    $*      所有传递的位置参数是
    $@      所有传递的位置参数是
    $#      总共传递的参数个数是
    $$      当前程序运行的PID
    $?      上一个命令执行的返回结果
    
    
    $* 与$@的区别,当不加引号时,二者相同
    加入引号时,$* 把它当做一个整体
    而$@则是把它拆分开来
    
    
    1. 通过位置传参的方式,创建Linux系统账号及密码

      useradd $1
      echo $2 | passwd --stdin $1
      
      
      

    2.通过传参的方式,Linux系统账户及密码,控制最多传递两个参数

    [root@manager var_01.sh]# cat 2.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 2.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
    
    if [ $# -ne 2 ];then
        echo "请传递两个参数 [ username | passwd ]"
        exit
    fi
    
    useradd $1
    echo $2 | passwd --stdin $1
    
    
    

    3.变量赋值

    除了自定义变量,以及系统内置变量,还可以使用read命令通过交互方式传递变量。

    read选项 选项含义
    -p 打印信息
    -t 限定时间
    -s 不回显
    -n 指定字符个数

    使用read方式进行系统登陆

    [root@manager var_01.sh]# cat 3.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 3.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
    read -p "Login: " acc
    read -n6 -t50 -s  -p "Passwd: " pw
    
    echo "你输入的用户名是:$acc"
    echo "你输入的密码是:$pw"
    
    
    

    需求1:使用read模拟Linux登陆页面

    [root@manager var_01.sh]# cat 4.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 4.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
    
    echo "hostnamectl | awk -F ":" '/System/{print $2}'"
    echo "hostnamectl | grep "Kernel""
    
    read -p "manager Login: " acc
    read -s -t50 -p "Password: " pw
    echo ""
    
    echo "你输入的用户名: $acc 你输入的密码是: $pw"
    
    
    

    需求2.用read备份数据

    [root@manager var_01.sh]# cat 5.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 5.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
     read -p "请输入要备份的源:" bf
     read -p "情输入要备份到哪里去:" mb
     read -p "确认是否备份 [ y | n ]: " Action
    
     if [ $Action == y ];then
        cp -rpv $bf $mb
     fi
    
    
    

    需求3:使用read编写一个探测主机存活

    [root@manager var_01.sh]# cat 6.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 6.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
    read -p "请输入要测试的主机ip:" Ip
    
    ping -W1 -c1 "$Ip" &> /dev/dull
    
    if [ $? -eq 0 ];then
        echo "该主机可以通"
    else
        echo "该主机不可以通讯"
    fi
    
    
    

    需求4: 修改主机名称

    [root@manager var_01.sh]# cat 7.sh 
    #!/bin/bash
    #********************************************************************
    #Author: 杨
    #QQ: 429007127
    #Date: 2019-10-28
    #FileName: 7.sh
    #URL: http://blog.yangxiaoni.top
    #Description: The test script
    #********************************************************************
    
    
    echo "当前主机名称是: $(hostname)"
    read -p "请输入要修改的主机名:" Hostname
    
    read -p "你确定要将 $(hostname) 变更为 $(Hostname) 吗?[ y | n ]" Action
    
    if [ $Action == "y" ];then
        hostname ${Hostname}
        hostnamectl set-hostname $Hostname
        echo "你的主角名称已修改成功"
    fi
    
    
    

    4.shell变量替换

    1.什么是变量替换?

    简单来说,就是在不改变原有的变量的情况下,对白能力进行替换。

    2.为什么要用变量替换

    例如:我们需要对某个变量的值进行整数比对,单变量的值是一个小鼠。怎么办?我们可以使用变量替换的方式,将小数位进行删除,然后再进行比对。

    3.变量替换的几种方式

    变量 说明
    ${变量#匹配规则} 从头开始匹配,最短删除
    ${变量##匹配规则} 从头开始匹配,最长删除
    ${变量%匹配规则} 从尾开始匹配,最短删除
    ${变量%%匹配规则} 从尾开始删除,最长删除
    ${变量/旧字符串/新字符串} 替换变量的旧字符串为新字符串,只能替换第一个
    ${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换

    实例:

    ------------#
    [root@manager ~]# echo ${url#*.}        #从头开始匹配,最短匹配
    sina.com.cn 
    [root@manager ~]# echo ${url##*.}       #从头开始匹配,最长匹配
    cn
    
    ------------%
    [root@manager ~]# echo ${url%.*}
    www.sina.com
    [root@manager ~]# echo ${url%%.*}
    www
    
    -------------/
    [root@manager ~]# echo ${url/c/C}
    www.sina.Com.cn
    [root@manager ~]# echo ${url//c/C}
    www.sina.Com.Cn
    
    
    

    需求2:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:

    1)、打印string长度
    2)、删除字符串中所有的Hadoop
    3)、替换第一个Hadoop为Linux
    4)、替换全部Hadoop为Linux
    用户输入数字1|2|3|4,可以执行对应项的功能
    
    
    [root@manager variables]# cat var12.sh 
    #!/bin/bash
    # Author:      Oldux.com QQ: 552408925
    # Date:       2019-10-28
    # FileName:   var12.sh
    # URL:         https://www.xuliangwei.com
    # Description: 
    string="Bigdata process is Hadoop, Hadoop is open source project"
    
    echo $string
    echo "1)、打印string长度"
    echo "2)、删除字符串中所有的Hadoop"
    echo "3)、替换第一个Hadoop为Linux"
    echo "4)、替换全部Hadoop为Linux"
    read -p "请输入对应的选项 [ 1 | 2 | 3 | 4 | q ] " Action
    
    if [ $Action -eq 1 ];then
        echo "他的长度是: ${#string}"
    fi
    
    if [ $Action -eq 2 ];then
            echo "${string//Hadoop/}"
    fi
    
    if [ $Action -eq 3 ];then
        echo ${string/Hadoop/Linux}
    fi
    
    if [ $Action -eq 4 ];then
        echo ${string//Hadoop/Linux}
    fi
    
    

    需求3:查看内存/当前使用状态,如果使用率超过80%则报警发邮件,思路如下:

        1.当前内存使用百分比是多少
        2.进行判断比对  
            如果大于80%  则触发邮件
            否则,over
            已使用的内存  /  总内存  * 100 = 使用的百分比
            
    mem_use=$(free -m | awk '/^Mem/ {print $3/$2*100}')
    if [ ${mem_use%.*}  -ge 10 ];then
        echo "你的内存已经超过了80%  目前的内存使用状态是 ${mem_use}%"
    fi
    
    
    需求1:根据系统时间,打印今年和明年时间。
    [root@manager variables]# cat var14.sh 
    #!/bin/bash
    # Author:      Oldux.com QQ: 552408925
    # Date:       2019-10-28
    # FileName:   var14.sh
    # URL:         https://www.xuliangwei.com
    # Description: 
    
    echo "今年的时间是: $(date +%Y)"
    echo "明年的时间是: $(( $(date +%Y) +1 ))"
    
    

    需求2:根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
    date +%j 已经过了多少天

    一年有365天   已经过了 301 = 还剩下   365-301 = 64  / 7 = 还剩下多少周
                  已经过了 301 天 / 7 = 已经过了多少周
                  
    [root@manager variables]# cat var15.sh 
    #!/bin/bash
    # Author:      Oldux.com QQ: 552408925
    # Date:       2019-10-28
    # FileName:   var15.sh
    # URL:         https://www.xuliangwei.com
    # Description: 
    Date=$(date +%j)
    
    echo "今年已经过了 ${Date}   天"
    echo "今年已经过了 $[ ${Date} /7 ] 周"
    echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ]  周"
    echo "从现在距离下一个新年还有  $[ 365 - ${Date} ]  天"
    
    

    需求3:完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除,思路如下:

        1.使用read让用户传值:     $1 $2
        2.对传入的值进行运算:
        3.输出对应的结果.
    [root@manager variables]# cat var16.sh 
    #!/bin/bash
    # Author:      Oldux.com QQ: 552408925
    # Date:       2019-10-28
    # FileName:   var16.sh
    # URL:         https://www.xuliangwei.com
    # Description: 
    
    echo "$1 + $2 = $[ $1 + $2 ]"
    echo "$1 - $2 = $[ $1 - $2 ]"
    echo "$1 * $2 = $[ $1 * $2 ]"
    echo "$1 / $2 = $[ $1 / $2 ]"
    echo "$1 % $2 = $[ $1 % $2 ]"
    
    
    

    相关文章

      网友评论

          本文标题:Shell第一天

          本文链接:https://www.haomeiwen.com/subject/xeqwvctx.html