• shell脚本之流程控制


     

    shell脚本之流程控制


    条件语句

    选择执行:
      注意:if语句可嵌套

    单分支

    if 判断条件;then
        条件为真的分支代码
    fi

    双分支

    if 判断条件; then
        条件为真的分支代码
    else
        条件为假的分支代码
    fi

    多分支

    if 判断条件1; then
        条件为真的分支代码
    elif 判断条件2; then
        条件为真的分支代码
    elif 判断条件3; then
        条件为真的分支代码
    else
        以上条件都为假的分支代码
    fi

    逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
    示例:

    if ping -c 1 -W 2 station1 &>/dev/null;then
        echo'Station1isUP' 
    elif grep"station1"~/maintenance.txt&>/dev/null ;then
        echo'Station1isundergoingmaintenance‘
    else 
        echo'Station1isunexpectedlyDOWN!' exit1
    fi

    条件判断

    case 变量引用in
    PAT1)
        分支1
        ;;
    PAT2)
        分支2
        ;;
    ...
    *)
        默认分支
        ;;
    esac

    case支持glob风格的通配符:

    1. *:任意长度任意字符
    2. ?:任意单个字符
    3. []:指定范围内的任意单个字符
    4. a|b: ab

    循环语句for,while,until

    for循环

    for 变量名in 列表;do
        循环体
    done

    执行机制:
    依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
    列表生成方式

    • (1) 直接给出列表
    • (2) 整数列表:
    • (a) {start..end}
    • (b) $(seq[start [step]] end)
    • (3) 返回列表的命令 $(COMMAND)
    • (4) 使用glob,如:*.sh
    • (5) 变量引用;$@, $*
     

    while循环

    while CONDITION; do
        循环体
    done

    `CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
    因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

    进入条件:CONDITION为true
    退出条件:CONDITION为false

    until循环

    until CONDITION; do
        循环体
    done

    CONDITION同while
    进入条件:CONDITION 为false
    退出条件:CONDITION 为true

    循环控制语句continue

    continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

    while CONDTIITON1; do
    CMD1
    ...
    if CONDITION2; then
        continue
    fi
    CMDn
    ...
    done

    循环控制语句break

    break [N]:提前结束第N层循环,最内层为第1层

    while CONDTIITON1; do
    CMD1
    ...
    if CONDITION2; then
        break
    fi
    CMDn
    ...
    done

    循环控制shift命令

    用于将参量列表list 左移指定次数,缺省为左移一次。
    参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while循环遍历位置参量列表时,常用到shift。
    ./doit.sh a b c d e f g h
    ./shfit.sh a b c d e f g h 

    #!/bin/bash
    # Name: doit.sh
    # Purpose: shift through command line arguments
    # Usage: doit.sh [args]
    
    while[ $# -gt 0 ] # or (( $# > 0 ))
    do
        echo $*
        shift
    done
    #!/bin/bash
    #step through all the positional parameters
    
    until[-z "$1"]
    do
        echo "$1"
        shift
    done
    echo

    创建无限循环

    while true;do
    
        循环体
    
    done
    until false;do
    
        循环体
    
    done

    while的特殊用法

    while循环的特殊用法(遍历文件的每一行):

    while read line; do
        循环体
    done < /PATH/FROM/SOMEFILE

    依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

    for的特殊用法

    双小括号方法,即((…))格式,也可以用于算术运算
    双小括号方法也可以使bash Shell实现C语言风格的变量操作
    I=10
    ((I++))

    for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
    do
        循环体
    done

    控制变量初始化:仅在运行到循环代码段时执行一次
    控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
    例如:

     
    for((i=0;i<=20;i++))
    do
      echo "Helllo I am $i"
    done

    select循环与菜单

    select variable in list
    do
        循环体命令
    done

    select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入。
    用户输入菜单列表中的某个数字,执行相应的命令
    用户输入被保存在内置变量REPLY

    select与case

    select 是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c 退出循环。
    select 经常和case 联合使用
    与for 循环类似,可以省略in list,此时使用位置参量
    示例:

     
    PS3="please input numbert: "
    select menu in 羊肉汤 米饭 胡辣汤 饺子 拉面 烩面 quit;do
      case $REPLY in
      1)
        echo "羊肉汤,the price is 15."
        ;;
      2)
        echo "米饭,the price is 12."
        ;;
      3)
        echo "胡辣汤,the price is 30."
        ;;
      4)
        echo "饺子,the price is 20."
        ;;
      5)
        echo "拉面,the price is 12."
        ;;
      6)
        echo "烩面,the price is 10."
        ;;
      7)
        break
        ;;
      esac
    done

    信号捕捉trap

    trap '触发指令' 信号
        自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
    trap '' 信号
        忽略信号的操作
    trap '-' 信号
        恢复原信号的操作
    trap -p
        列出自定义信号操作

    示例:

     
    #!/bin/bash
    
    trap 'echo "signal:SIGINT"' int
    
    trap -p
    for((i=0;i<=10;i++))
    do
      sleep 1
      echo $i
    done

    trap '' int trap -p for((i=11;i<=20;i++)) do   sleep 1   echo $i done

    trap '-' int trap -p for((i=21;i<=30;i++)) do   sleep 1   echo $i done

  • 相关阅读:
    CopyOnWriteArrayList分析
    java锁和同步
    线程池原理
    Hadoop1的安装
    Hadoop2的HA安装(high availability):JournalNode+ zookeeper
    Hadoop2的HA安装(high availability):nfs+zookeeper
    Hadoop2的FN安装(federated namespace)
    Redis 基础知识
    mycat
    GitFlow及项目工作流程
  • 原文地址:https://www.cnblogs.com/duzhaoqi/p/7538563.html
Copyright © 2020-2023  润新知