zoukankan      html  css  js  c++  java
  • shell前情介绍

    1. shell介绍

        shell是一个程序,采用C语言编写,是用户和linux内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。通过一个图表来查看一下shell的作用。

           

      kernel(内核):管理硬件并驱动硬件完成工作

      user:用户接口,用户下指令给内核

      shell:命令解释器,把用户输入的命令解析成二进制交给内核

     什么是shell脚本?

      shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。

      一个最简单的例子:安装nginx的shell脚本

      

      修改shell脚本的权限为可执行权限(chmod 700即可)

      检查是否安装好nginx时需要把防火墙关闭:

        查看 SElinux(一套增强Linux系统安 全的强制访问控制体系)状态:getenforce

        临时关闭 SElinux:setenforce 0

        永久关闭 SElinux:vim /etc/selinux/config   将SELINUX=enforcing改为SELINUX=disabled,保存退出

        关闭防火墙:systemctl stop firewalld

        永久关闭防火墙:systemctl disable firewalld

    2. 学习shell语法前必知必会

     2.1 shell脚本的语法规范

      一个合格的shell脚本应该按照以下格式书写:

        1):顶行标注解释环境  #!/bin/bash  或  #!/usr/bin/env bash

        2):该脚本信息,Author、Created time、Script Description(不能出现中文)

        3): 执行代码

    #!/bin/bash
    #Author: Bai Shuming
    #Created Time: 2018/08/2712:27
    #Script Description: first shell study script
    
    
    #放要执行的代码...

      shell脚本开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的

     2.1 如何运行一个脚本

      在子shell中运行,不影响当前shell

      1):给脚本文件赋予执行权限,chmod u+x filename,然后直接执行 ./opt/filename

      2):用bash命令来执行未被赋权的脚本,bash filename  或  sh filename

      在当前用户下运行另一个用户的脚本?

        su ossuser -c bash './opt/filename'

      在当前shell中运行,当前shell受影响

      在执行时候用source命令执行:source filename

     2.2 shell中的特殊符号

       不要和正则表达式中的符号含义搞混淆了。
    
        ~:                家目录    # cd ~ 代表进入用户家目录
        !:                执行历史命令   !! 执行上一条命令
        $:                变量中取内容符
        + - *  %:       对应数学运算  加 减 乘 除 取余数  
        &:                后台执行
        *:                星号是shell中的通配符  匹配所有
        ?:                问号是shell中的通配符  匹配除回车以外的一个字符
        ;:               分号可以在shell中一行执行多个命令,命令之间用分号分割
        |:               管道符 上一个命令的输出作为下一个命令的输入   cat filename | grep "abc"
        :                转义字符
        ``:               反引号 命令中执行命令    echo "today is `date +%F`"
        ' ':              单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
        " ":              双引号,脚本中出现的字符串可以用双引号引起来

     2.3 shell的数学运算

      方法一: expr

    expr 命令只能做整数运算,格式比较固定
    [root@haha ~]# expr 5 + 5
    10
    [root@haha ~]# expr 5 - 2
    3
    [root@haha ~]# expr 5- 2       #注意格式错误
    expr: 语法错误
    [root@haha ~]# expr 5 * 2    #注意要将*进行转义,否则认为是通配符
    10
    [root@haha ~]# expr 10 / 2
    5
    [root@haha ~]# expr 3 % 2
    1
    
    
    使用bc计算器处理浮点运算,scale=2表示小数点保留两位
    [root@haha ~]# echo "scale=2;10/3"|bc
    3.33
    [root@haha ~]# echo "当前内存使用率为:`echo "scale=2;282*100/2018"|bc`%"
    当前内存使用率为:13.97%

      方法二: $(())

      echo $((numb1+numb2))

    在shell中,也可以使用$(()) 也可以作运算
    [root@haha ~]# echo $((2 + 3))
    5
    [root@haha ~]# echo $((2 ** 3))
    8
    [root@haha ~]# echo $(((100+3)%2))
    1

      方法三: $[]

    [root@haha shell_0502]# echo $[2+5]
    7
    [root@haha shell_0502]# echo $[2*5]
    10
    [root@haha shell_0502]# echo $[(1+3)*2]
    8

      方法四: let 运算

    [root@haha shell_0503]# let sum=2+3;echo $sum
    5
    [root@haha shell_0503]# let sum++; echo $sum
    6

      实现一个计算内存使用率的脚本

      基础版 

        注意: awk 后面跟单引号, 不能跟双引号$3 表示第3列,$(NF)表示最后一列,$(NF-1)表示倒数第二个

    #!/bin/bash
    # 内存的使用率
    
    mem_used=`free -m | grep Mem | awk '{print $3}'`
    mem_total=`free -m | grep Mem | awk '{print $2}'`
    mem_use_ratio=$((mem_used * 100 / mem_total))
    
    echo "当前内存使用率的百分比: $mem_use_ratio"

      加强版

    #!/bin/bash
    #内存超过80%就用日志记录一下
    
    mem_use=`free -m | grep "Mem" | awk '{print $3}'`
    mem_total=`free -m | grep "Mem" | awk '{print $2}'`
    mem_use_percent=$((mem_use*100 / mem_total))
    file_name="mem_warn.log"
    
    if [ ! -e $file_name ]
      then
        touch $file_name
    fi
    
    if (( mem_use_percent >= 80 ))
      then
        echo "警告:请注意内存使用!"
        echo "`date +"%F %H:%M:%S"`的内存使用率为${mem_use_percent}%" >> $file_name
    fi

     2.4 退出脚本

       在每条命令执行完之后,系统都会返回一个 exit num 表示该条命令的执行结果,一般0表示执行成功, 非0表示执行失败。可用 echo $? 查看上条命令的执行结果。

      exit  NUM 退出脚本, 释放系统资源, NUM为一个整数,代表返回值(在0-255之间,可以自定义)。

     2.5 shell输出(echo格式化输出)

       echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。

            echo "要显示的字符"

              注意:(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符,包括 $、`、 等特殊符号

      语法:echo [-ne][字符串]

      命令选项:  

        -n:不要在最后自动换行

        -e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出

        转义字符  

          a发出警告声;

          删除前一个字符(手写一个倒计时脚本可以用到);  

           插入tab;

          c最后不加上换行符号;

           换行且光标移至行首;

           光标移至行首,但不换行;

          v与f相同; 插入字符;

           nn插入nnn(八进制)所代表的ASCII字符;

    [root@haha snd]# echo -e "aaaaaa"        # 发出警告声
    
    [root@haha snd]# echo -e "hello"      # 删除  前面的字符e
    hllo
    [root@haha snd]# echo -e "hello	world"     # helloworld中间加一个tab
    hello    world

       练习一个倒计时脚本:

    #!/bin/bash
    for time in `seq 9 -1 0`; do
        echo -n -e "$time"
        sleep 1
    done
    
    echo

      echo显示内容带颜色,需要使用 -e 参数,格式如:echo -e "33[文字背景颜色;文字颜色m 字符串33[0m",例如 echo -e "33[41;36m something here 33[0m"

    下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
    
      例
      echo -e “033[31m 红色字 033[0m”
      echo -e “033[34m 黄色字 033[0m”
      echo -e “033[41;33m 红底黄字 033[0m”
      echo -e “033[41;37m 红底白字 033[0m”
      
    字颜色:30—–37
      echo -e “033[30m 黑色字 033[0m”
      echo -e “033[31m 红色字 033[0m”
      echo -e “033[32m 绿色字 033[0m”
      echo -e “033[33m 黄色字 033[0m”
      echo -e “033[34m 蓝色字 033[0m”
      echo -e “033[35m 紫色字 033[0m”
      echo -e “033[36m 天蓝字 033[0m”
      echo -e “033[37m 白色字 033[0m”
    
      
    字背景颜色范围:40—–47
      echo -e “033[40;37m 黑底白字 033[0m”
      echo -e “033[41;37m 红底白字 033[0m”
      echo -e “033[42;37m 绿底白字 033[0m”
      echo -e “033[43;37m 黄底白字 033[0m”
      echo -e “033[44;37m 蓝底白字 033[0m”
      echo -e “033[45;37m 紫底白字 033[0m”
      echo -e “033[46;37m 天蓝底白字 033[0m”
      echo -e “033[47;30m 白底黑字 033[0m”
      
    最后面控制选项说明
      033[0m 关闭所有属性
      033[1m 设置高亮度
      033[4m 下划线
      033[5m 闪烁
      033[7m 反显
      033[8m 消隐
    
      033[30m — 33[37m 
    
    设置前景色
      033[40m — 33[47m 设置背景色
      033[nA 光标上移n行
      033[nB 光标下移n行
      033[nC 光标右移n行
      033[nD 光标左移n行
      033[y;xH设置光标位置
      033[2J 清屏
      033[K 清除从光标到行尾的内容
      33[s 保存光标位置
      033[u 恢复光标位置
      033[?25l 隐藏光标
      033[?25h 显示光标 

     2.6 shell输入(read交互输入)

      当脚本程序执行到read命令时,程序由 running 状态变为 sleep 状态, 等待用户从键盘输入, 直到用户敲下 Enter 键,程序才继续往下走。

        语法:read [-stnp]

        read 命令选项:

        -s:不显示

        -t:限定时间

        -n:限定输入字符个数

        -p:打印信息

    [root@haha shell_0407]# read
    xiaoming
    [root@haha shell_0407]# read -n2     # 2s不输入自动退出
    [root@haha shell_0407]# read -s    # 不显示输入内容
    [root@haha shell_0407]# read -s passwd; echo $passwd    # 将用户输入的内容赋值给变量passwd, 并echo查询
    123123
    [root@haha shell_0407]# read -n6 user    # 显示user为6位
    xiaomi[root@haha shell_0407]# 
    [root@haha shell_0407]# read -p "Login: " user    # 显示信息,并将用户输入的信息赋值给变量user
    Login: xiaoming
    [root@haha shell_0407]# echo "Login: $user"
    Login: xiaoming

      练习不校验用户名和密码的登录脚本

    #!/bin/bash
    clear
    
    echo "Centos Liinux 7 (Core)"
    echo -e "Kernel `uname -r` an `uname -m`
    "
    
    read -p "$HOSTNAME login: " account
    read -s -p "password: " password
    echo
  • 相关阅读:
    Java 替换 PPT 中的图片
    Java 转换 PDF 版本
    Java 在Word文档中添加艺术字
    Java 删除 Excel 中的空白行和列
    Java 为 PPT 中的图形添加阴影效果
    nginx作用及其配置
    Dockerfile
    Zookeeper学习
    vagrant up启动报错Call to WHvSetupPartition failed
    Vagrant安装启动linux,VitrtualBox,Centos7
  • 原文地址:https://www.cnblogs.com/bk9527/p/12657273.html
Copyright © 2011-2022 走看看