shell-if判断

作者: 你好_请关照 | 来源:发表于2019-09-25 22:10 被阅读0次

    sehll 介绍:

    shell 是一个命令解释器,用来翻译用户输入的指令给内核,内核驱动硬件,硬件将结果返回给内核,内核打印到屏幕
    sehll 脚本:
    (1)将系统命令堆积起来,顺序执行
    (2)特定格式+特定语法+系统命令=脚本

    shell 脚本编写规范:

    1. 开头加#!/bin/bash 作用:告诉脚本使用哪种命令解释器
    2. 附带作者及版权信息
    3. 编写的脚本放在固定目录下
    4. 脚本的扩展以.sh 结尾
    5. 脚本中尽量不要使用中文
    6. 成对的符号一次书写完成
    7. 循环格式一次性输入完成

    exit 、break、continue 三者区别 在此篇:https://www.jianshu.com/p/496c9d9f1b88

    一、变量:

    1、什么使变量:就是用一个固定的字符串去表示不固定的值,便于后续引用。

    2、shell 变量的定义方式:

    2.1用户自定义变量:人为定义变量

    生效范围:只对当前进程有效
    自定义变量的命名规范:
    1、建议使用大写字母、小写字母、下划线组成
    2、变量名具备一定的含义
    3、不能数字开头
    4、非连续的字符或数字使用 单''、双""引号引起来。
    单双引号的作用
    单引号:#单引号,弱引用,不会解析引号中的变量
    双引号:#强引用,会解析引号中的变量
    如:

    Cpu_load_ava_1=5
        HostName="db01"
        Address_eth0='172.16.1.10'
        Log='hello word'
    
    [root@db01 ~]# Log='hello word'
    [root@db01 ~]# echo ${Log}_good
    hello word_good
    [root@db01 ~]# 
    
    2.2系统环境变量:保存的是和系统环境相关的数据

    查看当前系统的环境变量:exoprt 或env
    系统环境变量可以直接使用
    2.2.1 自定义系统环境变量

    [root@db01 ~]# export var=123
    [root@db01 ~]# sh var.sh 
    123
    [root@db01 ~]# cat var.sh 
    #!/usr/bin/bash
    ##################################
    #Filename:   var.sh               
    #Author:     xiaoxi               
    #Email:      xiaoxi@qq.com        
    #Date:       2019-09-22           
    ####################################
    echo $var
    [root@db01 ~]# 
    
    2.3位置参数变量:向脚本中传递参数,变量名不能自定义,变量的作用是固定的
    位置参数 作用
    $n n 为数字,$1 表示出现的第一个参数$2 为第二个以此类推 ,10 以上的参数需要用大括号包含, 如${10}
    2.4预定义的变量:在bash中已经定义好的,变量不能自定义,变量的作用也是固定的。
    位置参数 作用
    $0 这个变量表示执行的脚本本身
    $* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
    $@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
    $# 这个变量代表命令行中所有参数的个数
    $? 返回上一条命令的执行结果
    $$ 返回当前进程的PID

    -----------------------------$与$@的区别------------------------------------------
    不加引号时,二者都是返回传入的参数
    加了引号后,
    $
    把参数作为一个字符串整体(单字符串)返回
    $@ 把每个参数作为一个一个的字符串进行返回

    位置变量和预定义变量演示如下:

    [root@db01 ~]# cat var.sh 
    #!/usr/bin/bash
    echo '当前脚本的名称' $0
    echo '当前脚本的第一个变量' $1 
    echo '当前脚本的第二个变量'$2 
    echo '当前脚本的第三个变量'$3
    echo '当前脚本的变量个数 '$#
    echo '当前脚本的所有的变量是'$@
    echo '当前脚本的所有变量个数是'$*
    echo '上一条命令的执行结果是'$?
    echo '此脚本执行的进程的PID是' $$
    [root@db01 ~]# sh ~/var.sh aa bb cc 
    当前脚本的名称 /root/var.sh
    当前脚本的第一个变量 aa
    当前脚本的第二个变量bb
    当前脚本的第三个变量cc
    当前脚本的变量个数 3
    当前脚本的所有的变量是aa bb cc
    当前脚本的所有变量个数是aa bb cc
    上一条命令的执行结果是0
    此脚本执行的进程的PID是 44107
    [root@db01 ~]# 
    

    3、变量赋值

    shell 中 read的使用
    read -p "请输入..." -p 后面跟描述
    read -t 3 -p "请输入..." -t 后面跟超时时间

    举例:

    [root@db01 /server/scripts]# cat var1.sh 
    #!/usr/bin/bash
    ###############################
    #Filename:var1.sh
    #Author:xiaoxi
    #Email:xiaoxi@qq.com
    #Date: 2019-09-22
    #Version:1.1 
    ################################
    
    read   -p "请输入您要备份的目录或文件:" backup #backup 是变量
    
    read -t 10 -p "您确定要备份吗 Y|N?" action    #同样的action 也是变量 
    
    if [ $action == "y" ] ;then
    
    echo "--------backup start --------------"
    sleep 3 
    echo "-----------backup $backup done -------------"
    else 
    echo "--------------backup flase------------"
    
    fi
    [root@db01 /server/scripts]# 
    
    

    4、变量的替换

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

    从头部开始删除

    [root@db01 ~]# echo $url
    www.xiaoxi.ren    
    [root@db01 ~]# echo ${url#*.}
    xiaoxi.ren
    [root@db01 ~]# echo ${url##*.}
    ren
    [root@db01 ~]# 
    

    从尾部开始删除

    [root@db01 ~]# echo $url
    www.xiaoxi.ren
    [root@db01 ~]# echo ${url%.*}
    www.xiaoxi
    [root@db01 ~]# echo ${url%%.*}
    www
    [root@db01 ~]# 
    
    

    5、 变量运算

    num1 + num2 加    
    num1 - num2 减
    num1 * num2 乘
    num1 / num2 除
    num1 % num2 余
    

    运算方法 :
    expr :

    [root@db01 ~]# expr 1 + 1 
    2
    [root@db01 ~]# 
    

    $(()):

    [root@db01 ~]# echo  $(($(date +%Y)+1))
    2020
    [root@db01 ~]# 
    

    $[]:

    [root@db01 ~]# echo $[1+1]
    2
    [root@db01 ~]# 
    

    举例:在脚本中变量参与简单运算

    #!/usr/bin/bash
    read -p "请输入你要传入的第一个数字: " num1
    read -p "请输入你要传入的第二个数字: " num2
    echo "$num1 + $num2 = $(( $num1 + $num2 ))"
    echo "$num1 - $num2 = $(( $num1 - $num2 ))"
    echo "$num1 * $num2 = $(( $num1 * $num2 ))"
    echo "$num1 / $num2 = $(( $num1 / $num2 ))"
    
    

    统计变量的长度

    [root@db01 ~]# num=111222333
    [root@db01 ~]# echo ${#num}
    9
    [root@db01 ~]# 
    
    

    二 、if 语句的

    流程控制if 语句的三种格式:

    if语句做条件判断的时候,中括号前后必须有空格

    1、单分支if语句

    if [ 判断条件 ];then
        条件;
    fi
    

    2、双分支if 语句

    if [ 判断条件 ];then
        条件;
    else
        条件;
    fi
    

    3、多分支if语句

    if  [ 判断条件 ];then
    
        条件;
    eilf  [ 判断条件 ];
        条件;
    else  
        条件;
    fi
    

    2、流程控制语句四种比较方式

    2.1 流程控制语句if文件比较

    常用参数 作用 示例
    -s 如果文件存在并且不为空则为真 [ -s /ect/file ]
    -e 如果文件或目录存在则为真 [ -e /ect/file ]
    -d 如果文件存在且为目录则为真 [ -d /ect/file ]
    -f 如果文件存在且为普通文件则为真 [ -f /ect/file ]
    -r 如果文件存在且可读则为真 [ -r /ect/file ]
    -w 如果文件存在且可执行则为真 [ -w /ect/file ]
    -x 如果文件存在且可执行则为真 [ -x /ect/file ]
    2.2流程控制语句if整数比较
    参数 说明 示例
    -eq 等值为真 [ 1 -eq 1 ]
    -ne 不等值为真 [ 1 -eq ]
    -gt 大于条件为真 1 -gt 10 ]
    -lt 小于条件为真 [ 1 -lt ]
    -ge 大于等于条件为真 [ 1 -ge 10 ]
    -le 小于等于为真 [ 1 -eq 10 ]
    2.3流程控制语句if字符比较
    参数 说明 示例 额外示例
    == 等于条件则为真 [ a==b]
    != 不相等条件为真 [ "a" != "b" ]
    -z 字符串长度为0则为真 [ -z "$a"] 变量$a为空则为真
    -n 字符串长度不为空则为真 [ -n "$a" ] 变量$a有内容
    var1>var2 var1大于var2为真 [ var1>var2]
    var1<var2 var1小于var2为真 [ var1<var2]
    2.4流程控制语句if正则比较

    使用正则表达式比较必须使用双中括号比较

    [[ "$user" =~ ^[0-9]+$ ]]  判定变量是不是全部为数字
    [[ "$user" =~ ^[a-z]+$ ]]  判断变量是不是全部是小写字母
    [[ "$user" =~ ^[A-z]+$ ]]  判断变量是不是全部是大写字母
    [[ "$user" =~ ^[a-Z]+$ ]]  判断变量是不是以字母开头
    [[ ! "$user" =~ ^[a-Z]+$ ]] 如果$user 不是字母则为真;(!表示对条件取反)
    
    [root@db01 ~]# user=abcD
    [root@db01 ~]# [[ "$user" =~ ^[a-Z]+$ ]] ;echo $?
    0
    
    

    3、if 三种语句使用

    3.1 单分支语句使用

    [root@db01 /server/scripts]# cat if.sh 
    #!/usr/bin/bash
    if grep "$1" /etc/passwd;then
        echo "ok"
    fi
    
    [root@db01 /server/scripts]# 
    
    

    3.2 双分支

    [root@db01 /server/scripts]# cat if.sh 
    #!/usr/bin/bash
    if grep "$1" /etc/passwd;then
        echo "ok"
    else 
        echo "err"
    fi
    [root@db01 /server/scripts]# 
    

    3.3 多分支

    #!/usr/bin/bash
    
    read -p "请输入成绩: " cj
    
    if [[ ! $cj =~ ^[0-9]+$ ]];then
        echo "请输入纯数字....."
        exit 1
    fi
    if [ $cj -ge 0 -a $cj -le 59 ];then
        echo "补考"
    elif [ $cj -ge 60 -a $cj -le 80 ];then
        echo "良好"
    else
        echo "优秀!"
    fi
    

    三、勤加练习

    1.在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式

    2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下

    2.编写一个脚本,使用systemctl检测服务是否运行的

    1.如何判断我们服务是否是运行   systemctl status sshd
    2.判断前者命令执行是否成功,成功则输出运行,失败则输出程序灭有运行
    

    3.查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件

    1.怎么查看磁盘        # df -h
    2.怎么提取使用率   df -h|grep "/$"|awk '{print $(NF-1)}'   echo ${disk/\%/}
    3.判断,整数
    

    4.备份mysql,手动输入你需要备份的库名称

    1.提示用户手动输入库名称:read
    2.如果用户输入数据库名称,则执行mysqldump命令备份
    3.备份到哪,/backup/mysql
    

    5.根据学生录入的成绩判断,学生的优劣,可以使用if单条件,和if的多条件

    1-59  补考
    60-80 合格
    80-100 优秀
    

    6.使用root用户清空/var/log/messages日志,并每次执行保留最近100行

    1、判断必须是root     字符串判断
    2、判断文件必须存在      文件判断
    3、情空后需要保留最近100 tail
    

    7.判断httpd服务是否正常启动 文件名必须是httpd_daemon.sh

    8.根据不同的系统安装不同的yum源

    9.安装不同版本的PHP, echo输出即可

    10.查看内存/当前使用状态,如果使用率超过80%则报警发邮件

    1.如何查看内存            free -m
    2.如何查看内存百分比 使用的/总的*100=使用百分比  free -m|awk '/^Mem/ {print $3/$2*100}'
    

    11.写一个创建用户的脚本,需要输入创建用户的前缀,比如oldboy,以及后缀。比如123。

    read -p "请输入您要创建的用户前缀:"  user_qz
    
    read -p "请输入您要创建用户的后缀: " user_hz
    
    id $user_qz$user_hz &>/dev/null
    
    if [ $? -eq 0  ];then
        echo "$user_qz$user_hz 用户已经存在"
    else 
    
        useradd $user_qz$user_hz 
        if [ $? -eq 0 ];then
            echo "$user_qz$user_hz 用户已经创建"
        else
            echo "创建用户失败"
        fi
    
    fi
    
    

    12.备份MySQL中的所有数据库,每个库一个.sql的文件,记得排除没用的

    1.如何拿到所有的库名称
    2.拿到后一个一个备份
    

    13.写一个rsync的启动和停止的脚本

    1.如何启动的命令 rsync --daemon   
    ps aux|grep rsync|grep -v grep
    2.如何停止kill,
        pkill rsync
    3.脚本名称rsync_daemon
    

    14.case场景示例,编写一个nginx的启动和停止脚本。(不允许重复执行脚本,加锁。)

    1.如何启动   /usr/sbin/nginx
    2.如何停止   /usr/sbin/nginx -s stop
    3.如何重载  /usr/sbin/nginx -s reload
    

    相关文章

      网友评论

        本文标题:shell-if判断

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