• Shell编程语法


    shell流程控制

    流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法。

    新知识点:

    黑洞文件,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程。

    /dev/dull

    提示你输入一个东西

    read -p

    间隔几秒显示

    sleep 数字

    对输出的结果不显示新行

    echo -n 

    意思是初始值为0,一般结合let ++使用。

    sum=0 

    读取每行的内容

    read line 

    if语句(条件语句)

    格式一:

    #!/bin/bash
    
    if  [ 条件表达式 ];then
    
    命令(切记用tab键自动缩进一下,后期好排错)
    
    fi

     格式二:

    #!/bin/bash
    
    if  [ 条件表达式 ]
    
    then
    
    命令(切记用tab键自动缩进一下,后期好排错)
    
    fi

    就是说你的条件表达式满足之后,你想干一些什么事情。

    if分为单分支,双分支,多分支三种样式

    单分支

    if 条件表达式;then             
    
      命令(按tab键自动缩进一下)
    
    fi

    举例:如果你输入的参数是1,那么显示的结果是“您输入的数字是1”(运用到的知识点,shell的特殊变量)

    #!/bin/bash
    
    if [ $1 -eq 1 ];then
    echo
    "您输入的数字是$1"
    fi

    双分支(当条件表达式里的命令执行不成功时,就会执行else)

    if 条件表达式;then
    
      命令(按tab键自动缩进一下)
    
    else
    
      命令(按tab键自动缩进一下)
    
    fi

    举例:如果输入不是1的其他数字,显示的结果就是“您输入的数字不是1”

    if [ $1 -eq 1 ];then
            
            echo "您输入的数字是: $1"
    
    else
           
            echo "您输入的数字不是1"
    
    fi        

    双分支运用实例

    利用双分支检测一下crond是否开启

    #!/bin/bash
    
    soft
    =crond
    status_crond
    =`ps aux | grep "crond" | grep -v "grep" | wc -l`
    if [ $status_crond -eq 1 ];then
    echo
    "$soft 正在运行!" else
    echo
    "$soft 未运行" fi

    利用双分支检查主机是否在线(黑洞文件,/dev/dull,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程,只显示echo的输出结果,给用户一个好的体验。)

    #/bin/bash
    
    ip
    =192.168.1.9
    ping
    -c 1 -w $ip &> /dev/null
    if [ $? -eq 0 ];then
      echo
    "$ip在线"

    else
       echo
    "$ip不在线" fi

    多分支

    if 条件表达式;then
    
      命令(按tab键自动缩进一下)
    
    elif 条件表达式;then
    
      命令(按tab键自动缩进一下)
    
    else
    
      命令(按tab键自动缩进一下)
    
    fi

    read –p:提示你输入一个东西

    #!/bin/bash
    read -p "请输入一个数字: "num
    if [ $num -le 5 ];then
            echo "您输入的$num小于等于5"
    elif [ $num -gt 5 -a $num -le 10 ];then
             echo "您输入的$num大于5小于等于10"
    elif [ $num -gt 10 -a $num -le 20 ];then
             echo "您输入的$num大于10小于等于20"
    elif [ $num -gt 20 -a $num -le 30 ];then
             echo "您输入的$num大于20小于等于30"
    elif [ $num -gt 30 -a $num -le 40 ];then    
             echo "您输入的$num大于30小于等于40"
    else
             echo "您输入的数字大于40!"
    fi

    多分支运用实例

    利用多分支编写一个简单的计算器

    #!/bin/bash
    read -p "请输入第一个数字: "num1
    read -p "请输入运算符号: "num2
    read -p "请输入第二个数字: "num3
    if [ -n "$num1" -a -n "$num2" -a -n "$num3" ];then
            if [ "$num2" == "+" ];then
                    echo "${num1}${num2}${num3}=$((num1+num3))"
            elif [ "$num2" == "-"];then
                    echo "${num1}${num2}${num3}=$((num1-num3))"
            elif [ "$num2" == "*"];then
                    echo "${num1}${num2}${num3}=$((num1*num3))"
            elif [ "$num2" == "/"];then
                    echo "${num1}${num2}${num3}=$((num1/num3))"
            else
                    echo "请输入+-*/"
            fi
    else
            echo "请输入数字或运算符"
    fi

    利用多分支检查用户是否存在

    #!/bin/bash
    
    read
    -p "请输入一个用户: "user

    if id $user &> /dev/null;then
       echo
    "$user存在"
    else
       echo
    "$user不存在!"
    fi

    for语句(循环语句,主要用于批量管理、检测)

    书写格式:

    第一种书写格式:

    for 变量名 in 取值列表; do
    
      命令
    
    done

    第二种书写格式:

    for 变量名 in 取值列表
    
    do
    
      命令(切记首行缩进,tab键)
    
    done

    输出一个1至9的数列,每2秒输出一行

    #!/bin/bash
    
    for i in `seq 9`
    do
      echo
    "$i"
      sleep
    2
    done

    运用实例

    批量检测主机是否在线,在这里,ip是一个变量,i也是一个变量,两者的结合,就组成了IP。

    #!/bin/bash
    ip=192.168.1.
    for i in {1..255}
    do
            if ping -c 1 -w 1 $ip$i &> /dev/null;then
                    echo "$ip$i在线"
            else
                    echo "$ip$i不在线"
            fi
    done

    工作中的检测IP是否在线

    #!/bin/bash
    ./etc/init.d/functions
    ip=192.168.1.
    for i in {1..255}
    do
            if ping -c 1 -w 1 $ip$i &> /dev/null;then
                    echo  -n"$ip$i"
                    success
                    echo ""
            else
                    echo -n"$ip$i"
                    failure
                    echo ""
            fi
    done

    求1到100的奇数和是多少(运用到前面学习的let ++)

    #!/bin/bash
    sum=0
    for i in `seq 1 2 100`
    do
            let sum+=$i
    done
    echo $sum

    while循环语句(一般做的是死循环,条件为假就退出循环)

    书写格式:

    while 条件表达式; do
    
        命令
    
    done

    这个是说只会循环1至5一次,当let++的值大于5时,就停止循环。

    #!/bin/bash
    sum=0
    while [ $sum -lt 5 ]
    do
            let sum++
            echo $sum
    done

    死循环,就是条件永为真

    第一种永为真的方式:

    #!/bin/bash
    sum=0
    while true
    do
            let sum++
            echo $sum
            sleep 2
    done

    第二种永为真的方式:

    #!/bin/bash
    sum=0
    while [1 -eq 1]
    do
            let sum++
            echo $sum
    done

    while运用实例

    检测在线终端数量,这种虽然占用终端,但是把输出的内容写入到了/root/ter这个文件之中。

    #!/bin/bash
    while true
    do
            num=`who | wc -l`
            echo "当前终端数量为$num" >> /root/ter
            sleep 5
    done
    #!/bin/bash
    while true
    do
            num=`who | wc -l`
            if [ $num -eq 5 ];then
                mail -s "当前在线终端数量达到预警值"
                exit
            fi
    done

     如何把一个文本一行一行的读取出来

    #!/bin/bash
    cat /etc/passwd | while read line
    do
            echo $line
            sleep 2
    done
    #!/bin/bash
    while read line
    do
            echo $line
            sleep 2
    done < /etc/passwd

    如何在不占用终端的情况下还在持续检测,方法有两种。

    一:bash 脚本名称 & 而后再开一个终端tail –f 监测输出到文本即可。但是关掉运行此命令的终端,监测就会停止。

    二:nohup bash 脚本名称 & 这样既不会占用当前终端,关掉当前运行此命令的终端也不会打断监测。

    nohup意为挂起,他会生成一个nohup.out文件。

    break(终止循环,停止当前的循环)和continue(跳出本次循环,就是你设置之后,不显示你设置的内容,之后进入死循环)语句

    意思就是只输出1至4,到5的时候,就停止循环。

    #!/bin/bash
    sum=0
    while true 
    do
        
        let sum++
           if [ $sum -eq 5 ];then
                break
            fi
            echo $sum
    done

    意思就是只显示1至10,但不显示5,当let ++的值大于10时,就停止此循环。

    #!/bin/bash
    sum=0
    while true 
    do
        
        let sum++
           if [ $sum -eq 5 ];then
                continue
           elif [ $sum -gt 10 ];then
                break
            fi
            echo $sum
    done
    #!/bin/bash
    sum=0
    while true 
    do
        
        let sum++
           if [ $sum -eq 5 ];then
                continue
           elif [ $sum -gt 10 ];then
                exit
            fi
            echo $sum
    done

    case语句(用于centos6系统书写程序启动脚本)

     书写格式:

    case 模式名    in
    模式 1)
    
      命令
    
      ;;
    
    模式 2)
    
      命令
    
      ;;
    
    *)
    
      不符合以上模式执行的命令
    
    esac
    #!/bin/bash
    function start {
            if  [ -e /pid ];then
                    echo "httpd is running"
            else
                /usr/local/httpd/bin/apachectl start 
            fi
    }
    function stop {
            if  [ -e /pid ];then
                /usr/local/httpd/bin/apachectl stop
            fi
    }
    function restart {
            if  [ -e /pid ];then
                    /usr/local/httpd/bin/apachectl stop
                    /usr/local/httpd/bin/apachectl start
            else
                /usr/local/httpd/bin/apachectl start 
            fi
    }
    case $1 in
    case $1 in
    start)
                start
    ;;
    stop)
                stop
    ;;
    restart)
                reatrart
    ;;
    status)
                systemctl status httpd &> /dev/null
                echo "httpd status"
    ;;
    *)
                echo "Usage: $0 start|stop|restart|status"
    esac

    练习

    打印九九乘法口诀表

    #!/bin/bash
    for i in `seq 9`
    do 
            for a in `seq 9`
            do
                    if [ $a -lt $i ];then
                        echo -n "$a*$i=$((a*i))"
                    fi
             done
             echo "" 
    done
    View Code

    持续监测内存剩余量

    #!/bin/bash
    while true
    do
            free=$(free -h | grep "Men" | cut -d "M" -f 4 | tr -d "  ")
            if [ free -lt 500];then
                mail -s "当前内存剩余低于预警值"
            fi
    done
    View Code
  • 相关阅读:
    关于Maven项目的pom.xml中的依赖或插件失效的解决方法
    java引用数据类型在方法中的值传递
    java匹配http或https的url的正则表达式20180912
    java正则表达式的进阶使用20180912
    java线程池 多线程 搜索包含关键字的文件路径
    魔术球问题
    [SDOI2009]晨跑
    [洛谷P2045]方格取数加强版
    最小路径覆盖问题
    最长不下降子序列问题
  • 原文地址:https://www.cnblogs.com/shuaiyin/p/10917254.html
Copyright © 2020-2023  润新知