美文网首页
Shell编程之if流程控制语句

Shell编程之if流程控制语句

作者: 你好树洞先生 | 来源:发表于2019-12-19 17:06 被阅读0次

    (接上篇的序号)

    8.read 示例:

      read示例语法,测试用户输入的IP是否通

      1.执行脚本时,提示:请输入ip

      2.使用ping命令去探测是否是通,如果通则返回存活,如果不通则返回失败。

      if [];then

          else

      fi

    ------------------------------------------------------------

    #!/bin/bash

    #1.提示用户输入一个ip地址

    read -p "请输入需要检测的IP地址:" IP

    #2.使用ping命令检测IP地址是否通讯

    ping -W1 -c1 $ip &>/dev/null

    #3.检查上一次命令执行返回状态码是否正常

    if [$? -eq 0];then

        echo "$IP 能正常通信"

    else

        echo "$IP 无法正常通信"

    fi

    ----------------------------------------------------------------

    [root@test shell]# sh ping1.sh

    请输入需要检测的IP地址:127.0.0.1

    127.0.0.1 能正常通信

    请输入需要检测的IP地址:192.168.1.1

    192.168.1.1 无法正常通信

    ========================================

    升华:

    使用read命令写一个脚本修改主机名和IP地址

      1.提示用户输入主机名称

      2.提示用户输入IP地址】

      3.询问用户是否输入IP地址

      4.真实的执行

    代码:

    #!/bin/bash

    #1.提示用户输入新的主机名称,然后打印新的主机名称

    read -p "请输入你想要修改的主机名称:" HostName

    echo "你将要修改的主机名称为:$HostName"

    #2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出

    read -p "你确认真的要修改如下内容吗[Y|N]?" readly

    #3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出

    if [$readly == "Y"];then

        hostnamectl set-hostname $HostName

    else

        exit

    fi

    -----------------------------------------------------------

    [root@test shell]# sh read.sh

    请输入你想要修改的主机名称:www.sm.com

    你将要修改的主机名称为:www.sm.com

    你确认真的要修改如下内容吗[Y|N]?" n

    [root@test shell]# sh read.sh

    请输入你想要修改的主机名称:www.sm.com

    你将要修改的主机名称为:www.sm.com

    你确认真的要修改如下内容吗[Y|N]?" Y

    ===========================================

    9.Shell 变量替换:

    变量                        说明

    ${变量#匹配规则}          从头开始匹配,最短删除

    ${变量##匹配规则}        从头开始匹配,最长删除

    ${变量%匹配规则}          从尾开始匹配,最短删除

    ${变量%%匹配规则}        从尾开始匹配,最长删除

    ${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换一个

    ${变量//旧字符串/新字符串}替换变量内的旧字符串为新字符串,全部替换

    eg:1.从前往后删除变量内容

    [root@test shell]# url=www.sina.com.cn  #定义变量

    [root@test shell]# echo ${url}          #输出变量的值

    www.sina.com.cn

    [root@test shell]# echo ${url#*.}    #从前往后,最短匹配

    sina.com.cn

    [root@test shell]# echo ${url##*.}  #从前往后,最长匹配

    cn

    eg:2.从后往前删除变量内容:

    [root@test shell]# url=www.sina.com.cn  #定义变量

    [root@test shell]# echo ${url}          #输出变量的值

    www.sina.com.cn

    [root@test shell]# echo ${url%*.}      #从后往前,最短匹配

    www.sina.com

    [root@test shell]# echo ${url%%*.}      #从后往前,最长匹配,贪婪匹配

    www

    -----------------------------------------------------------

    eg:3.变量内容替换:

    [root@test shell]# url=www.sina.com.cn    #定义变量

    [root@test shell]# echo ${url/sina/baidu}   #替换sina为baidu

    www.baidu.com.cn

    [root@test shell]# echo ${url/n/N}             #替换第一个小n为大写N

    www.siNa.com.cn

    [root@test shell]# echo ${url//n/N}           #替换全部小n为大写N

    www.siNa.com.cN

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

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

    分析:

    1.备份什么?      源  /etc

    2.备份到哪?      目标 /root/bak

    3.使用什么方式?  压缩 tar

    4.备份的周期?    每月第一天,如何每月第一天。crond

    代码:

    #!/bin/bash

    DestPath=/root/bak

    Date=$(date +%Y_%m_%d)

    Date=$(date +%Y_%m_%d)

    #1.准备目标位置

    [ ! -d $DestPath ] && mkdir -p $DestPath

    #2.备份到目标位置

    tar czf $DestPath/${Date}_etc.tar.gz /etc

    [root@test shell]# crontab -l

    00 23 1 * * bash /root/fileback &>/dev/null

    =================================================

    10.流程控制语句if基本概述

    1)单分支结构

    if [ 如果你有房 ];then

        我就嫁给你

    fi

    eg:

    #!/bin/bash

    if which ls;then

        echo "ok";

    fi

    2)多分支结构

      if [ 如果你有房 ];then

      elif [ 你有车 ];then

      elif [ 你有钱 ];then

        else

            再见

      fi

    eg:

    #!/bin/bash

    read -p "input a user:" tu

    if grep $tu /etc/passwd ;then

            echo " 用户 $tu 存在该系统"

    elif ls -d /home/$tu ; then

            echo "用户 $tu 不存在该系统"

            echo "但是 $tu 用户家目录存在"

    else

    echo  "用户 $tu不存在该系统"

    echo  "$tu 用户也不存在家目录"

    fi

    ==========================================

    案例1:场景实践,查看内存/当前使用状态,如果使用率超过80%则报警发邮件。

      1.如何查看内存          free -m

      2.如何查看内存百分比    使用的/总的*100=使用百分比

      free -m|awk '/^Mem/ {print $3/$2*100}'

    代码:vi free_use.sh

    #!/bin/bash

    #监控内存使用百分比,超过百分之80则报警

    free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')

    if [ ${free_use%.*} -gt 80 ];then

        echo "你的内存超过了百分之80,当前是${free_use%.*}%"

    else

        echo "你的内存正常使用,当前是${free_use%.*}%"

    fi

    [root@test shell]# sh free_use.sh

    你的内存正常使用,当前是15%。

    ========================================

    案例2:场景实践,在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

    分析:

    1)批量修改txt为txt.bak                      find

    2)把所有的.bak文件打包压缩为123.tar.gz      tar

    3)批量还原文件的名字,及把增加的.bak再删除  find

    代码:

    #!/bin/bash

    #1.改名

    find /bakup -inname "*.txt"|sed -r 's#(.*)#mv \1.bak#g|bash'

    #2.打包

    tar czf /backup/123.tar.gz $(find /backup -iname "*.bak")

    #3.还原

    find /backup -inname "*.bak"|sed -r 's#(.*).bak#mv \1.bak \1#g'|bash

    -----------------------------------------------------------

    升华:

    #!/bin/bash

    #定义变量

    T=txt

    B=bak

    #把backup 目录下.txt结尾的文件修改成txt.bak

    cd /backup && rename $T $T\.$B *.txt

    #把所有的.bak 结尾的文件打包压缩为123.tar.gz

    tar zcvf /backup/123.tar.gz  /backup/*.bak

    #还原文件的名字

    rename $T\.$B $T *

    -----------------------------------------------------------

    利用for循环:

    #!/bin/bash

    File_txt=$(find /back/ -type f -iname ".txt"|xargs >/backup/txt.tt)

    for i in $(cat /backup/txt.tt)

    do

        mv $i $i.bak

    done

    cd /backup/

    tar czf 123.tar.gz ./*.bak

    File_bak=$(find /backup/ -type f -iname "*.bak" >/backup/txt.tt)

    for j in $(cat /backup/tar.tt)

    do

        mv $j ${j%.*}

    done

    ==================================================================

    3)流程控制语句if文件比较

    if语句中的文件比较

    参数                      说明                                 示例

    -e        文件或目录存在则为真                    [ -e file ]

    -s        文件存在且至少有一个字符则为真  [ -s file ]

    -d        文件存在且为目录为真                    [ -d file ]

    -f        文件存在且为普通文件则为真          [ -f file ]

    -r        文件存在且可读则为真                    [ -r file ]

    -w       文件存在且可写则为真                   [ -w file ]

    -x        文件存在且可执行则为真                [ -x file ]

    -----------------------------------------------------------

    eg1:判断/etc/hosts文件是否存在

    if [ -e /etc/hosts ];then  #当条件为真时,则执行then后面的代码

        echo "ok";

    fi

    eg2:判断/etc/hosts文件是否存在

    if [ -e /etc/hosts ];then

        echo "ok"

    else

      echo "err"

    fi

    案例3:

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

    2.提示用户手动输入库名称:read

    3.如果用户输入数据库名称,则执行mysqldump命令备份

    4.备份到哪,/banckup/mysql

    #!bin/bash

    DestPath=/backup/mysql

    [ -d $DestPath ] || mkdir -p $DestPath

    read -p "请输入你要备份的数据库名称:" db

    /usr/bin/mysqldump --single-transaction -R

    -B $db > $DestPath/${db}_${date +%F}.sql

    if [ $? -eq 0 ];then

            echo "-----------"

    echo "$db 数据库备份成功"

    echo "-----------"

    fi

    4)数值比较 [ 整数1 操作符 整数2 ]

    参数      说明                       示例                     状态   

    -eq        等于则为真          [ 1 -eq 10 ]               假

    -ne        不等于则为真      [ 1 -ne 10 ]                真    条件一致为假,否则为真

    -gt        大于则为真          [ 1 -gt 10 ]                  假

    -lt        小于则为真           [ 1 -lt 10 ]                    真

    -ge        大于等于则为真  [ 1 -gt 10 ]                  假

    -le        小于等于则为真   [ 1 -le 10 ]                   真

    eg:

    #!/bin/bash

    if [ $# -ge 1 ];then

          systemctl status $1 > /dev/null

      if[ $? -eq 0 ];then

              echo "$1 服务正在运行"

      else

    echo "$1 服务暂末运行"

      fi

    else

        echo "执行脚本的格式"

        echo "sh $0 服务名"

    fi

    --------------------------------------------------------------

    案例4:

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

    思路:

    1. 怎么查看磁盘  #df -h

    2.怎么提取使用率  df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}

    #!/bin/bash

    Disk_Free=$(df -h|grep "/$"|awk '{print $5}'|awk -F '%' 'print' %1 )

    if [ $Disk_Free -ge 80 ];then

        echo "Disk Is Use: ${Disk_Free}%" > /tmp/disk_use.txt

    fi

    --------------------------------------------------------------

    案例4--升华:

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

    思路:

    1. 怎么查看磁盘  #df -h

    2.怎么提取使用率  df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}

    3.判断,整数

    #!bin/bash

    disk_use=$(df -h | grep "/$"|awk '{print ${NF-1}')

    if [ ${disk_use/\%} -ge 80 ];then

        echo "你的磁盘使用率过高。。。${disk_use}"

    else

      echo "你的磁盘使用率正常。。。${disk_use}"

    fi

    --------------------------------------------------------------

    5)if字符串比较

    参数                 说明                                   示例

    ==            等于则为真                           [ "$a" == "$b"]

    !=            不相等则为真                        [ "$a" != "$b"]

    -z            字符串的长度为零则为真      [ -z "$a" ]

    -n            字符串的长度不为空则为真  [ -n "$a" ]

    str1 > str2    str1大于str2为真              [ str1 > str2 ]

    str1 > str2    str1小于str2为真             [ str1 < str2]

    eg:根据学生的录入成绩判断,学生的优劣:

      1-59  补考

      60-80  合格

      80-100 优秀

      1.read 读入学生输入的分数

      2.比较分数,看是否符合那条件

          小于60    补考

          等于60    合格

          高于80    优秀

    [root@test shell]# cat if-2.sh

    read -p "请输入你的分数:" fs

    if [ $fs -lt 60 ];then

        echo "补考"

    elfi [ $fs -gt 100 ];then

        echo "不老实"

    elif [ $fs -ge 80 ];then

    echo "优秀"

    elif [ $fs -ge 60 ];then

    echo "合格"

    fi

    ----------------------------------

    升华版:

    根据学生的录入成绩判断,学生的优劣:

      1-59  补考

      60-80  合格

      80-100 优秀

      1.read 读入学生输入的分数

      2.比较分数,看是否符合那条件

          小于60    补考

          等于60    合格

          高于80    优秀

    代码:

    #!/bin/bash

    read -p "请输入你的分数:" fs

    if [ $fs -gt 0 -a $fs -lt 60 ];then

        echo "补考"

    elif [ $fs -ge 60 -a $fs -lt 80 ]; then

        echo "合格"

    elif [ $fs -ge 80 -a $fs -le 100 ];then

        echo "优秀"

    else

        echo "不老实"

    fi

    ----------------------------------------------------

    升级完整版:

    vi fs.sh

    read -p "请输入你的分数:" fs

    #判断数字

    expr $fs + 1 &>/dev/null

    if [ $? -ne 0 ];then

      echo "请输入数字"  && exit

    fi

    #判断是否为空值

    if [ -z $fs ];then

      echo "不要尝试直接回车,没有用的" && exit

    fi

    #判断成绩

    if [ $fs -gt 0 -a $fs -lt 60 ];then

      echo "补考"

    elif [ $fs -ge 60 -a $fs -lt 80 ];then

      echo "合格"

    elif [ $fs -ge 80 -a $fs -le 100 ];then

      echo "优秀"

    else

      echo "不老实"

    fi

    ========================================

    11. if语句正则比较:

    1)正则对比示例:

      #单括号无法使用正则语法

    [root@test shell]# [ "$USER" =~^r ];echo $?

    bash: [: =~: binary opertor expected ]

    #双[]才可以使用正则匹配

    [root@test shell]# [[ "$USER" =~ ^r ]];echo $?

    0

    --------------------------------------

    案例5: 判断用户输入的是否是 数字

    代码:

    #!/bin/bash

    read -p "请输入一个数值:" num

    if [[ ! "$num" =~ ^[0-9]+$ ]];then

    echo "你输入的不是数字,程序退出!!!"

    exit

    fi

    echo "你输入的数字是 $num"

    --------------------------------------------

    案例6:写一个创建用户的脚本,需要输入创建用户的前缀,比如student,以及后缀。比如123。

    #!/bin/bash

    read -p "请输入用户的前缀:" qz

    if [[ ! $qz =-^[a-Z]+$ ]];then

      echo "你输入的不是english。。。"

      exit

    fi

    read -p "请输入创建用户的后缀:" hz

    if [[ $hz =- ^[0-9]+$ ]];then

    user=${qz}${hz}

    id $user &>/dev/null

    if [ $? -eq 0 ];then

        echo "用户已经存在 $user"

    else

        useradd $user

        echo "用户创建成功 $user"

          fi

    fi

    --------------------------------------------------------------

    相关文章

      网友评论

          本文标题:Shell编程之if流程控制语句

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