• [ Shell入门教程 ] Shell流程控制与循环结构


     本文主要介绍Shell脚本中的流程控制语句,包括if/else、case,循环语句包括for循环、while循环、until循环等内容。并通过简单实例介绍它们的使用方法。

    if语句

    (1)最简单的if语句。使用格式有2种方式,分别如下

      使用格式1:

    if [ 条件判断式 ];then
        程序段
    fi

      使用格式2:

    if [ 条件判断式 ]
    then
        程序段
    fi

     特别说明:

    (1)建议使用格式1。格式1和格式2的区别是then重新换行以及是否带命令分隔符";"。

    (2)if语句使用fi结尾。否则报错。

     下面看一个简单示例。

    #!/bin/bash
    
    num1=10
    num2=15
    if [ "${num1}" -lt "${num2}" ];then
       echo "${num1} is less than ${num2}"
    fi

    (2)简单的if else语句,使用格式如下:

    if [ 条件判断式 ];then
        程序段
    else
        程序段
    fi

     使用if/else语句修改比较数值大小的实例,如下

    #!/bin/bash
    
    num1=20
    num2=15
    if [ "${num1}" -lt "${num2}" ];then
       echo "${num1} is less than ${num2}"
    else
       echo "${num1} is greater than ${num2}"
    fi

    (3)多分支的if else语句,使用格式如下:

    if [ 条件判断式1 ];then
        程序段
    elif [ 条件判断式2 ];then
        程序段
    else
       程序段
    fi

      继续修改比较数值大小的实例,代码如下

    #!/bin/bash
    
    num1=10
    num2=10
    if [ "${num1}" -lt "${num2}" ];then
       echo "${num1} is less than ${num2}"
    elif [ "${num1}" -gt "${num2}" ];then
       echo "${num1} is greater than ${num2}"
    else
       echo "${num1} is equal to ${num2}"
    fi

    case语句

      case语句为多选择语句,可以用case语句匹配一个值或者一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    casein
        模式1)
            程序段1
            ;;
        模式2)
            程序段2
            ;;
        ……
        *)
            程序段n
            ;;
    esac

       模式可以是变量或常数,可以包含元字符。其中*表示任意字符、?表示任意单一字符、[..]表示范围中的任意字符。下面通过实例来了解case语句用法。

    #!/bin/bash
    
    read -p "Please input yes or no:" YN
    
    case "${YN}" in
      Yes)
        echo "Input Yes"
        ;;
      No)
          echo "Input No"
        ;;
      yes|YES)
    echo "please input yes"
        ;;
      NO|no)
          echo "please input no"
        ;;
      *)
          echo "input error"
        ;;
    esac

    for循环

    (1)最简单的for循环语句,使用格式如下:

    for 变量名 in 值1 值2 值3 ... 值n
    do
      程序段
    done

     for循环工作时会对in后面的变量值逐一遍历取值并进入程序段操作。使用基本实例如下:

    #!/bin/bash
    
    for i in $(seq 1 5)
    do
      echo $i
    done

    (2)for循环的第二种格式如下

    for((初始值;限制值;执行步长))
    do
      程序段
    done

      该类型for循环适合数值方式的运算中。简单实例如下

    #!/bin/bash
    
    for((i=1;i<=10;i++))
    do
      echo $i
    done

    while循环

      while循环用于不断执行一系列命令,也用于从输入文件中读取数据,使用格式如下:

    while 命令
    do
      程序段
    done

    (1)打印1~100的整数

    #!/bin/bash
    
    i=1
    while [ $i -le 100 ]
    do
      echo $i
      i=$(($i+1))
    done

    (2)从文件中读取数据,打印每一行内容

    #!/bin/bash
    
    while read line
    do
      echo $line
    done < /etc/passwd 

    (3)从文件中读入,并赋值给对应的变量。假设student.txt文件中每一行包含3列分别为Name、Age、Address,字段分隔符为空格。

    #!/bin/bash
    
    while read NAME AGE ADDRESS
    do
      echo "name=${NAME}"
      echo "age=${AGE}"
      echo "address=${ADDRESS}"
    done < student.txt 

    (4)如果实例(3)中的student.txt文件字段分隔符为冒号":",可以使用变量IFS处理,处理方法如下:

    #!/bin/bash
    
    OLD_IFS=$IFS
    IFS=":"
    
    while read NAME AGE ADDRESS
    do
      echo "name=${NAME}"
      echo "age=${AGE}"
      echo "address=${ADDRESS}"
    done < student.txt 
    
    IFS=${OLD_IFS}

    until循环

      until循环执行一系列命令直至条件为真时停止。until循环会执行一次程序体再判断测试条件。测试条件为真,则执行退出。某些场景下,until循环会比while循环更好用。使用格式为如下

    until 命令
    do
      程序段
    done

    (1)打印1~100的整数

    #!/bin/bash
    
    i=1
    until [ $i -gt 100 ]
    do
      echo $i
        i=$(($i+1))
    done

    break和continue使用

     有时需要基于某些准则退出循环或者跳过循环步。其中break命令允许跳出循环、continue用于跳出当次循环。

    (1)打印小于50的整数。

    #!/bin/bash
    
    i=1
    while [ $i -le 100 ]
    do
      echo $i
      i=$(($i+1))
      if [ $i -gt 50 ];then
        break
      fi
    done

    (2)打印1-100以内的偶数。

    #!/bin/bash
    
    i=1
    while [ $i -le 100 ]
    do
      if [ $(expr $i % 2) -eq 0 ];then
          echo $i
      fi
      i=$(($i+1))
     done
  • 相关阅读:
    人生十鉴
    ASP.NET MVC 3 Preview 1 发布
    基于IPagedList 的 Asp.Net MVC 分页
    jenkins 更改用户
    MATLAB常用日期和时间函数
    Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies. 错误解决
    ORA00932: inconsistent datatypes: expected A got B
    几种数据库的大数据批量插入
    水晶报表 无效索引。 (异常来自 HRESULT:0x8002000B (DISP_E_BADINDEX))错误的解决
    oracle 更新多条数据
  • 原文地址:https://www.cnblogs.com/linyfeng/p/9096171.html
Copyright © 2020-2023  润新知