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

if语句

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

使用格式1:

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

使用格式2:

  1. if [ 条件判断式 ]
  2. then
  3. 程序段
  4. fi

特别说明:

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

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

下面看一个简单示例。

  1. #!/bin/bash
  2.  
  3. num1=
  4. num2=
  5. if [ "${num1}" -lt "${num2}" ];then
  6. echo "${num1} is less than ${num2}"
  7. fi

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

  1. if [ 条件判断式 ];then
  2. 程序段
  3. else
  4. 程序段
  5. fi

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

  1. #!/bin/bash
  2.  
  3. num1=
  4. num2=
  5. if [ "${num1}" -lt "${num2}" ];then
  6. echo "${num1} is less than ${num2}"
  7. else
  8. echo "${num1} is greater than ${num2}"
  9. fi

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

  1. if [ 条件判断式1 ];then
  2. 程序段
  3. elif [ 条件判断式2 ];then
  4. 程序段
  5. else
  6. 程序段
  7. fi

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

  1. #!/bin/bash
  2.  
  3. num1=
  4. num2=
  5. if [ "${num1}" -lt "${num2}" ];then
  6. echo "${num1} is less than ${num2}"
  7. elif [ "${num1}" -gt "${num2}" ];then
  8. echo "${num1} is greater than ${num2}"
  9. else
  10. echo "${num1} is equal to ${num2}"
  11. fi

case语句

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

  1. case in
  2. 模式1)
  3. 程序段1
  4. ;;
  5. 模式2)
  6. 程序段2
  7. ;;
  8. ……
  9. *)
  10. 程序段n
  11. ;;
  12. esac

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

  1. #!/bin/bash
  2.  
  3. read -p "Please input yes or no:" YN
  4.  
  5. case "${YN}" in
  6. Yes)
  7. echo "Input Yes"
  8. ;;
  9. No)
  10. echo "Input No"
  11. ;;
  12. yes|YES)
  13. echo "please input yes"
  14. ;;
  15. NO|no)
  16. echo "please input no"
  17. ;;
  18. *)
  19. echo "input error"
  20. ;;
  21. esac

for循环

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

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

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

  1. #!/bin/bash
  2.  
  3. for i in $(seq )
  4. do
  5. echo $i
  6. done

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

  1. for((初始值;限制值;执行步长))
  2. do
  3. 程序段
  4. done

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

  1. #!/bin/bash
  2.  
  3. for((i=;i<=;i++))
  4. do
  5. echo $i
  6. done

while循环

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

  1. while 命令
  2. do
  3. 程序段
  4. done

(1)打印1~100的整数

  1. #!/bin/bash
  2.  
  3. i=
  4. while [ $i -le ]
  5. do
  6. echo $i
  7. i=$(($i+))
  8. done

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

  1. #!/bin/bash
  2.  
  3. while read line
  4. do
  5. echo $line
  6. done < /etc/passwd

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

  1. #!/bin/bash
  2.  
  3. while read NAME AGE ADDRESS
  4. do
  5. echo "name=${NAME}"
  6. echo "age=${AGE}"
  7. echo "address=${ADDRESS}"
  8. done < student.txt

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

  1. #!/bin/bash
  2.  
  3. OLD_IFS=$IFS
  4. IFS=":"
  5.  
  6. while read NAME AGE ADDRESS
  7. do
  8. echo "name=${NAME}"
  9. echo "age=${AGE}"
  10. echo "address=${ADDRESS}"
  11. done < student.txt
  12.  
  13. IFS=${OLD_IFS}

until循环

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

  1. until 命令
  2. do
  3. 程序段
  4. done

(1)打印1~100的整数

  1. #!/bin/bash
  2.  
  3. i=
  4. until [ $i -gt ]
  5. do
  6. echo $i
  7. i=$(($i+))
  8. done

break和continue使用

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

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

  1. #!/bin/bash
  2.  
  3. i=
  4. while [ $i -le ]
  5. do
  6. echo $i
  7. i=$(($i+))
  8. if [ $i -gt ];then
  9. break
  10. fi
  11. done

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

  1. #!/bin/bash
  2.  
  3. i=
  4. while [ $i -le ]
  5. do
  6. if [ $(expr $i % ) -eq ];then
  7. echo $i
  8. fi
  9. i=$(($i+))
  10. done

shell流程控制与循环结构的更多相关文章

  1. 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结

    053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...

  2. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  3. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  4. 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句

    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...

  5. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...

  6. 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和

    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...

  7. 047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用

    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用 本文知识点:嵌套while循环应用 什么是循环嵌套? 什么是循环嵌套? ...

  8. 046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项

    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项 本文知识点:for循环的注意事项 for循环的注意事项 for循环有3个 ...

  9. 045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围

    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围 本文知识点:for循环应用及局部变量作用范围 for循环 w ...

随机推荐

  1. Windows安装部署Tensorflow过程中的问题处理

    1 在配置Tensorflow过程中有一行命令是 python object_detection/builders/model_builder_test.py 过程中出现了 NameError: na ...

  2. python 实现排序算法(二)-合并排序(递归法)

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Nov 21 22:28:09 201 ...

  3. Centos下安装Docker集群管理工具Shipyard

    一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持镜像管理.容器管理. 支持控制台命令 容器资源消耗监控 支持集群swarm,可以 ...

  4. KVM总结-KVM性能优化之CPU优化

    前言 任何平台根据场景的不同,都有相应的优化.不一样的硬件环境.网络环境,同样的一个平台,它跑出的效果也肯定不一样.就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同… 所以,我们做运维 ...

  5. Win7 发生验证错误 要求的函数不受支持

    今天登陆服务器突然登不上了,给我报了一个错误“发生验证错误 要求的函数不受支持”,用同事的win7电脑和win10电脑都可以,就是我的不行,气死我了,然后我百度百度啊,用了好几种“说用了就OK”的办法 ...

  6. 用socket发送信息在浏览器上显示出来

    服务端代码: import socket def main(): sock=socket.socket() sock.bind(('localhost',8089)) sock.listen(5) w ...

  7. 初级安全入门——SQL注入的原理与利用

    工具简介 SQLMAP: 一个开放源码的渗透测试工具,它可以自动探测和利用SQL注入漏洞来接管数据库服务器.它配备了一个强大的探测引擎,为最终渗透测试人员提供很多强大的功能,可以拖库,可以访问底层的文 ...

  8. json.loads()的字符串中为单引号引发的错误

    如下错误属于弱智错误,但是错的原因让我无语,所以记录一下 str2="{'card':6217001650004184441}"print(json.loads(str2)) Tr ...

  9. 04-spark streaming

    1.基本概念(了解) ①流(Streaming): 是一种数据传送技术,它把客户机收到的数据变成一个稳定连续的流,源源不断地送出,使用户听到的声音或看到的图象十分平稳, 而且用户在整个文件送完之前就可 ...

  10. java开发_""和null的区别

    转自:http://www.cnblogs.com/hongten/archive/2012/11/08/java_null.html#undefined 在代码中: 1 //name可以为" ...