• 9.Shell 流程控制(if for)


    一、if 语句

    二 、for循环

    正文

    一、shell的if语句

    1. if then 

    if 语句语法格式:

    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi

    2.if else

    if else 语法格式:

    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi

    3.if elif else

    if else-if else 语法格式:

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi

    举例子:

    note:

    • if 后面的中括号[ ], 跟变量之间有空格
    • 多行命令在一行写,要加分号“;”
    #!/bin/bash
    
    #1
    NUM=13
    if test $NUM!=3
    then
            echo "$NUM"
    fi
    
    #2
    NUM1=$[2*3]
    echo $NUM1
    NUM2=$[4+1]
    echo $NUM2
    if test $NUM1 -eq $NUM2
    then
            echo "$NUM1 = $NUM2"
    else
            echo "$NUM1 != $NUM2"
    fi
    
    #3
    a=10
    b=12
    if [ $a == $b ]
    then
            echo "a == b"
    elif [ $a -gt $b ]
    then
            echo "a > b"
    elif [ $a -lt $b ]
    then
            echo "a < b"
    fi
    
    #4
    # One line the ";" is needed!
    c=2;d=3
    if [ $c -le $d ];then echo "c<d";fi

    二、for 循环

    例1: for i in 格式的循环

    #!/bin/bash
    
    #1for的直接赋值
    for var in 1 2 3 4 5 6
    do
            echo -n -e  $var
            sleep 1
    done
    
    #2for的命令赋值
    for var in `seq 1 9`
    do
            echo $var
    done
    
    #3赋值是一个字符串,it's my bag, not his
    read -p "Login: " info
    for var in $info
    do
            echo $var
    done
    
    for var in it\'s my bag, not his
    do
            echo $var
    done
    shell的seq:squeue  是一个序列的缩写,主要用来输出序列化的东西
    用法:seq [选项]... 尾数  或:seq [选项]... 首数 尾数  或:seq [选项]... 首数 增量 尾数 以指定增量从首数开始打印数字到尾数。 -f, --format=格式 使用printf 样式的浮点格式 -s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) -w, --equal-width 在列前添加0 使得宽度相同【自动补位】 --help 显示此帮助信息并退出

    指定分隔符  横着输出

    [root@localhost ~]# seq -s '#' 5
    1#2#3#4#5

    以空格作为分格,且输出单数

    [root@localhost ~]# seq -s ' ' 10
    1 2 3 4 5 6 7 8 9 10

    默认补位操作

    复制代码
    [root@localhost ~]# seq -w 1 5
    01
    02
    03
    04
    05
    复制代码

    产生-2~10内的整数,增量为2

    复制代码
    [root@localhost ~]# seq -2 2 10
    -2
    0
    2
    4
    6
    8
    10
    复制代码

    产生98~101之间的整数,并且要求输出数字宽度相同

    %3g 表示宽度为3,不足用0补足

    复制代码
    [root@cnblogs ~]# seq -f "%03g" 98 101
    098
    099
    100
    101
    [root@cnblogs ~]# seq -f "%04g" 98 101
    0098
    0099
    0100
    0101
    [root@cnblogs ~]# seq -f "%05g" 98 101
    00098
    00099
    00100
    00101
    [root@cnblogs ~]# 
    复制代码

    % 前面还可以指定字符串

    一次性创建5个名为dir001 , dir002 .. dir005 的目录

    复制代码
    [root@cnblogs ~]# seq -f 'dir%03g' 1 5
    dir001
    dir002
    dir003
    dir004
    dir005
    [root@cnblogs ~]# seq -f 'dir%03g' 1 5|xargs mkdir
    [root@cnblogs ~]# ls -l dir*

    例2: C语言格式的for循环

    双圆括号(())有计算的功能,

    • 括号中的变量,条件,操作之间用分号隔开
    • 括号中的内容跟前后括号要有空格
    #!/bin/bash
    
    #1 
    for (( i=1;i<10;i++ ))
    do
            echo $i
    done
    
    #2 多变量
    for (( n=0,m=10;m>0; n++,m-- ))
    do
            echo $m,$n
    done

    例3 sleep N 脚本执行到该步,睡眠N秒

    表示日期的:

    /shell_j/sh_for$ date +%"F:%H:%M:%S"
    2021-12-22:20:16:07
    #!/bin/bash
    
    #1 倒计时
    echo -n "倒计时: "
    for i in `seq 9 -1 0`
    do
            echo -n -e "\b$i"
            sleep 1
    done
    echo
    
    #2 监控主机存活的脚本
    # 在 shell 中我们会见到 $0、$1、$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本>传的第二个参数
    for ((;;))
    do
            ping -c1 $1 &>/dev/null
              if [ $? -eq 0 ]
                then
                   echo "`date +%"F:%H:%M:%S"` $1 is up"
              else
                  echo "`date +%"F:%H:%M:%S"` $1 is down"
              fi
           sleep 5 # 脚本节奏控制,生产环境在1分钟及以上
    done

    sleep 5, 对cpu的使用率基本没有影响

    运行:倒计时从9-0后执行ping baidu的操作

    /shell_j/sh_for$ bash for_sleep.sh www.baidu.com
    倒计时:0
    2021-12-22:20:26:07 www.baidu.com is up

    给监控显示的log加上颜色:-e 取消转移字符

    #2 监控主机存活的脚本
    # 在 shell 中我们会见到 $0、$1、$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本>传的第二个参数
    for ((;;))
    do
            ping -c1 $1 &>/dev/null
              if [ $? -eq 0 ]
              then
                   echo -e "`date +%"F:%H:%M:%S"` $1 is \033[32m up \033[0m"
           else
                  echo -e  "`date +%"F:%H:%M:%S"` $1 is \033[31m down \033[0m"
           fi
           sleep 5 # 脚本节奏控制,生产环境在1分钟及以上
    done

    运行如下:

    例4: for循环中的continue 和break

    #!/bin/bash
    
    #1
    for (( i=0;i<10;i++ ))
    do
            if [ $i -eq 6 ];then
                    continue # 结束本次循环,进入下一次循环
            fi
            echo $i
    done
    echo
    for (( i=10;i>0;i-- )) do if [ $i -eq 6 ];then break # 结束所有的循环 fi echo $i done

    运行:

    /shell_j/sh_for$ bash for_continue_break.sh 
    0
    1
    2
    3
    4
    5
    7
    8
    9
    10 9 8 7

    例5:要求用户输入密码,5次机会;输入成功直接退出;5次都没输入成功提示密码输入错误。

    #!/bin/bash
    
    
    for (( i=0;i<5;i++ ))
    do
            read -p "Please input your password: " pwd
            if [ $pwd -eq "8787998" ];then
                    echo "Login Success"
                    break
            fi
            if [ $i -eq 4 ];then
                   echo "You have only 5 chance! Login failed! "
                   break
            fi
            echo "Your password is not correct, input again!"
    done

    例6: break N 跳出循环N层循环

    for循环的嵌套,从内往外数分别是1,2,3.。。。

    break 1 表示跳出最内层for循环(1 表示最内层时,可省略1,直接break)

    break 2 表示跳出从内向外的第二层for循环,以此类推。。。。

    #!/bin/bash
    
    for (( i=1;i<10;i++ ))
    do
            echo "loop i: $i"
            for(( j=0;j<5;j++ ))
            do
                    echo "loop j: $j"
                    if [ $j -eq 3 ];then
                            break
                    elif [ $j -eq 4 ];then
                            break 2
                    fi
            done
    done
  • 相关阅读:
    <译>Spark Sreaming 编程指南
    <译>Zookeeper官方文档
    <译>Flink官方文档-Flink概述
    <译>流计算容错
    <译>Flink编程指南
    <续>调度算法补充
    storm源码阅读笔记之任务调度算法
    海量数据处理方法归类
    storm中worker、executor、task之间的关系
    javax.swing.jFrame
  • 原文地址:https://www.cnblogs.com/ananmy/p/15712873.html
Copyright © 2020-2023  润新知