• 1-23-shell脚本之-if流程控制语句和for循环语句的使用


    大纲:

    1、逻辑判断

    2、if流程控制语句

    3、for循环控制语句

     

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

    在开始之前,先了解一下逻辑判断符号:

    && 与、|| 或、!

    A && B  必须A,B同时成立,才能通过判断

    ---> 判断流程:先执行A判断其是否成立,若成立,则继续执行B,判断其是否成立

    ---> 若不成立,则直接结束,不再执行B

    A || B  A、B有一个成立,即可通过判断

    !A     若A不成立,则通过判断

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

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

    在条件判断时,那面会比较数值或字符串,这是我们会用到一些参数和符号,如下

    比较数值:

    等于 ---> –eq

    不等于 ---> –ne

    小于 ---> –lt

    大于 ---> –gt 

    小于等于 ---> –le

    大于等于 ---> –ge

    一些英文单词:帮助记忆

    equal等于、not equal、less than、great than

    比较字符串:

    = 等于、== 等于,同=、!= 不等于、> 大于、<小于、-z字符串为空、-n字符串非空null

    注意:在[]结构中,<和>需要使用转义符号,如下图

    image

    实战1:判断当前系统语言环境

    image

    [root@xiaogan 02]# echo $LANG
    en_US.UTF-8
    [root@xiaogan 02]# echo $LANG | awk -F . '{print $1}'
    en_US
    [root@xiaogan 02]# vim lang.sh
    [root@xiaogan 02]# sh -x lang.sh
    ++ echo en_US.UTF-8
    ++ awk -F . '{print $1}'
    + language=en_US
    + '[' en_US = en_US ']'
    + echo 'The Default Language is English.'
    The Default Language is English.
    [root@xiaogan 02]# cat lang.sh
    #!/bin/bash
    # judged if the System Default Language is English

    language=$(echo $LANG | awk -F . '{print $1}')

    if
        [ $language = 'en_US' ]
    then echo "The Default Language is English."
    else echo "You are wrong!"
    fi

    [root@xiaogan 02]#


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

    if流程控制语句

     

    if语句有三种使用方式:

    格式如下:

    单分支:

    if 条件判断语句

    then 执行语句

    fi

    双分支:

    if 条件判断语句

    then 执行语句

    else 执行语句

    fi

    多分支:

    if 条件判断语句

    then 执行语句

    else 执行语句

    fi

    ##################################
    实战1:if单分支--->应用

    image

    源码如下:

    #!/bin/bash
    # if
    # then
    # fi

    if [ ! -d /root/cdrom ]
    then echo "/root/cdrom is not exist!"
    fi

    ##################################
    实战2:if双分支应用--->pinghost.sh
    ping -c 3 -i 0.2 -w 3 192.168.0.1

    -c 发送数据包个数

    -i 数据包每次发送间隔时间,默认单位:秒(s)

    -w 等待时间,超过返回失败

    image

    源码如下:

    #!/bin/bash
    # ping a given host and print the host status

    ping -c 3 -i 0.2 -w 3 $1 >>/dev/null #-c count -i  -w wait
    if [ $? -eq 0 ]
    then echo "the host $1 is up."
    else echo "the host $1 is down."
    fi

    ##################################

    实战3:if多分支应用--->判断数值区间 num_where.sh

    image

    源码如下:

    #!/bin/bash
    # judged the input score

    read -p "input you score(0-100):" num

    if [ $num -gt 85 ] && [ $num -lt 100 ]
    then echo "Great! Good Good Study!!"
    else echo "Day Day Up!"
    fi

    ##################################

    实战4:if嵌套使用

    编写脚本,监控服务运行状态
    启动失败后,保存日志,并重启服务,
    再次失败,提示重启主机

    image

    源码如下:

    #!/bin/bash

    systemctl status $1 >>/var/log/ser.log

    if [ $? -eq 0 ]
    then echo "the $1 is running."
    else echo "the $1 is dead."
        systemctl start $1 >>/dev/null
        if [ $? -eq 0 ]
        then echo "Reboot finish!"
            systemctl restart $1
        else echo "Warnning You to Reboot your server!"
        fi
    fi

    ##################################
    实战5:查询内核版本,并输出信息

    image

    源码如下;

    #!/bin/bash
    # search the major version of System, and print info.

    prime=$(uname -r | awk -F . '{ print $1}')

    if [ $prime -gt 2 ]
        then echo "The major version of System is $prime."
    elif [ $prime -lt 1 ]
        then echo "The System is too low."
    else echo "Failed!"
    fi

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

    for循环控制语句

    用法:

    for 变量名 in 变量遍历列表

    do

    循环语句

    done #循环结束表示

    ##################################

    实战:用户管理(批量添加用户)

    方法一:

    运行环境:

    image

    输出结果:

    image

    批量删除用户:

    image

    方法一优化:

    我们发现,在用方法一批量添加用户是,当用户不存在时,会有报错信息。查看运行过程如下:

    sh –x for01_useradd.sh

    image

    在进入循环后,我们会首先查找/etc/passwd下,是否已存在用户$user,

    但是,在运行过程中,我们发现,当这个用户不存在时user_a数值为空,判断条件就会少了一个比较值,而造成判断条件变为:[ = xiaogan ],这是系统就会报错!

    为了避免系统报错,我们可使用-z 或 -n选项来判断user_a变量是否为空。

    image

    执行结果如下:

    image

    方法二:我们也可以采取另外一种方法,来批量添加用户

    image

    各方法源码如下:

    方法一:

    #useradd.sh

    #!/bin/bash
    userlist=$( cat user.list )


    for user  in $userlist
    do
    user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' )
    if
        [ $user_a = $user ]
    then
        echo "The user $user is already exist."
    else
        useradd $user #2>>/dev/null
        echo "User $user is added."
    fi
    done

    ###########

    #userdel.sh

    #!/bin/bash
    userlist=$( cat user.list )

    for user  in $userlist
    do
        userdel -r $user 2>>/dev/null
        if [ $? = 0 ]
        then
            echo "The user $user is deleted!"
        fi
    done

    优化:

    #useradd.sh

    #!/bin/bash
    userlist=$( cat user.list )


    for user  in $userlist
    do
    user_a=$(grep -w "$user" /etc/passwd  | awk -F : '{print $1}' )
    if
       # [ $user_a = $user ]
        [ ! $user_a -z ] && [ $user_a = $user ] 
        # To determine whether user_a is empty, not empty in to continue
    then
        echo "The user $user is already exist."
    else
        useradd $user #2>>/dev/null
        echo "User $user is added."
    fi
    done

    方法二:

    #new useradd.sh

    #!/bin/bash
    # Batch add user by scripts
    # the new method

    userlist=$( cat user.list )

    for user in $userlist
    do
        useradd $user 2>>/dev/null
        if
            [ $? -eq 0 ]
        then
            echo "123456" | passwd --stdin $user >> /dev/null
            echo "Useradd Success!"
        else
            echo "The user $user is already exists."
        fi
    done

    ##################################

    实战:ping.sh #批量测试IP地址是否连通

     image
    源码如下:

    #!/bin/bash

    ip_list=$( cat ip.list )

    for ip in $ip_list
    do
        ping -w 3 -c 3 -i 0.2 $ip >>/dev/null
        if [ $? -eq 0 ]
            then echo "the $ip is up."
        else echo "the $ip is down."
        fi
    done

  • 相关阅读:
    javaScript系列 [35]HTML页面渲染的基本过程
    javaScript系列 [29] RegExp
    javaScript系列 [40]defineProperty
    javaScript系列 [32] type
    javaScript系列 [34]FormData
    javaScript系列 [39]deepClone
    javaScript系列 [33] new
    javaScript系列 [36]Call by sharing
    javaScript系列 [38]浏览器、HTML和内核(引擎)
    javaScript系列 [28] Event
  • 原文地址:https://www.cnblogs.com/xiaogan/p/5831848.html
Copyright © 2020-2023  润新知