shell编程中的三种流程控制

流程控制

v 一 、过程式编程语言:

1.顺序执行

2.选择执行

3.循环执行

 条件选择if 语句

  选择执行:

  注意: :if 语句可 嵌套

   单分支

if 判断条件then

条件为真的分支代码

fi

   双分支

if 判断条件; then

条件为真的分支代码

else

条件为假的分支代码

fi

   多分支

if CONDITION1 ; then

if-true

elif CONDITION2 ; then

if-ture

elif CONDITION3 ; then

if-ture

else

all-false

fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,

而后 结束整个if 语句

 if 实例

 根据命令的退出状态来执行命令

if ping -c1 -W2 station1 &> /dev/null; then

echo 'Station1 is UP'

elif grep "station1" ~/maintenance.txt &> /dev/null

then

echo 'Station1 is undergoing maintenance

else

echo 'Station1 is unexpectedly DOWN!'

exit 1

fi 

条件判断:case

case 用 变量引用 in           

PAT1)

分支1

;;

PAT2)

分支2

;;

*)

默认分支

;;

esac

 

case 支持glob 风格的通配符:

*: 任意长度任意字符

?: 任意单个字符

[] :指定范围内的任意单个字符

循环

 循环执行

将某代码段重复运行多次

重复运行多少次:

循环次数事先已知

循环次数事先未知

有进入条件和退出条件

 for, while, until

for 循环

v for 变量名 in 列表;do

循环体

done

v 执行 机制 :

依次 将列表中的元素赋值给“变量名”; 每次赋值后即执

行一次循环体; 直到列表中的元素耗尽,循环

for 循环

v 列表生成方式:

(1) 直接给出 列表

(2) 整数列表:

(a) {start..end}

(b) $(seq [start [step]] end)

(3) 返回列表的 命令

$(COMMAND)

(4) 使用glob, , 如:*.sh

(5) 变量引用;

$@, $*

  while 循环

v while CONDITION; do

循环体

done

v CONDITION :循环控制条件;进入循环之前,先做一次判

断;每一次循环之后会再次做判断;条件为“true” ,则执行

一次循环;直到条件测试状态为“false” 终止循环

v 因此:CONDTION 一般应该有循环控制变量;而此变量的值

会在循环体不断地被修正

v 进入条件:CONDITION true; ;

v 退出条件:CONDITION false

 until CONDITION; do

循环体

v done

v : 进入条件: CONDITION false

v : 退出条件: CONDITION true

 创建无限循环

v while true; do

循环体

v done

v until false; do

循环体

 Done

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

while read line; do

循环体

done < /PATH/FROM/SOMEFILE

 依次读取/PATH/FROM/SOMEFILE 文件中的每一行,且将

行赋值给变量line

 双小括号方法,即(()) 格式,也可以用于算术运算

 双小括号方法也可以使bash Shell 实现C 语言风格的变量操作

#I=10

#((I++))

v for 循环的特殊格式:

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

do

循环体

done

v 控制变量初始化:仅在运行到循环代码段时执行一次

v 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算

,而后再做条件判断

 break 命令可以带一个参数,一个不带参数的break 循环只能退出最内层的循环,而break N可以退出N 层循环。

 continue 命令也可以带一个参数,一个不带参数的continue 命令只去掉本次循环的剩余代码,而continue N 将会把N 层循环剩余的代码都去掉,但是循环的次数不变。

#!/bin/sh  

for i in "a b c d"

 do   

  echo "$i "

 for j in `seq 10`  

    do  

      if [ $j -eq 5 ];then

        break  

      fi         

      echo "$j "

    done

  echo      

 done  

break结果:

 a 1 2 3 4

 b 1 2 3 4

 c 1 2 3 4

 d 1 2 3 4

 continue结果:

 a 1 2 3 4 6 7 8 9 10

 b 1 2 3 4 6 7 8 9 10

 c 1 2 3 4 6 7 8 9 10

 d 1 2 3 4 6 7 8 9 10

 continue 2的结果:

 a 1 2 3 4

 b 1 2 3 4

 c 1 2 3 4

 d 1 2 3 4

 作业题

1.随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出

blob.png

2.求100以内所有正整数之和

blob.png

结果:

blob.png

3.编写脚本,通过ping命令探测10.1.252.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。

结果:
blob.png

代码:

#!/bin/bash

read -p "please input a IPv4(eg:10.1.0.100):" ip

  up=0 down=0

  ipv4=`echo $ip|cut -d. -f1-3`

  n=1

until [ $n -gt 255  ]

do

IP="$ipv4"."$n"

#for ipv in {0..255} ;do

 #  IP="$ipv4"."$ipv"

let n++

   ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null

done

 echo "IPv4($ipv4.1-255) up is :$up"

 echo "IPv4($ipv4.1-255) down is :$down"

   blob.png

4.编写脚本,打印九九乘法表

代码:

#/bin/bash

i=1

j=1

until (($i>=10))

do

j=1

until (($j>$i))

do

sum=$[ $j*$i ]

echo -ne "$i*$j=$sum \t"

if [ $i == $j ] ;then

echo -en "\n"

      fi

     let j++

done

     let i++

done

结果:

 blob.png

代码:

blob.png

5.编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者

blob.png

blob.png

6.编写脚本,实现打印国际象棋棋盘

blob.png

blob.png

7.打印等腰三角形

代码:
blob.png

结果:

blob.png

原创文章,作者:yywan1314,如若转载,请注明出处:http://www.178linux.com/37023

(0)
yywan1314yywan1314
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 浅谈正则表达式

    1.       什么是正则表达式 基本说来,正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。本文将用<<regex>>来表示一段具体的正则表达式。 一段文本就是最基本的模式,简单的匹配相同的文本。   2. &n…

    Linux干货 2016-08-12
  • 磁盘管理

    1、创建一个10G分区,并格式为ext4文件系统。 (1)虚拟机添加21G硬盘 Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1&nbsp…

    Linux干货 2016-12-18
  • N28-第二周作业

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    4、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    Linux干货 2017-12-11
  • 【超全整理】《Linux云计算从入门到精通》系列实战笔记全放送

          为了方便Linux云计算爱好者的学习查看,马哥Linx云计算团队特别整理了《Linux云计算从入门到精通》年度重磅大放送,囊括了整个学习过程的学习精华,内容全部由马哥Linux云计算学员撰写,欢迎大家支持!!!       详情请看:  一、Linux运维基础实战入门 从Linux0基础入门开始,全面讲解作为新手如何学习Linux,以及学习方法和…

    2017-09-14
  • N21 第二周练习

    ####1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。复制:cp   移动:mv    删除:rm   cp:copy,复制文件或目录</br>  cp [OPTION]… SOURCE… DIRECTORY…

    Linux干货 2016-07-22
  • 管理systemd

    管理systemd 一、systemd介绍 回顾一下centos的启动流程  POST –> Boot Sequence –> Bootloader –> kernel + initramfs(initrd) –> rootfs –> /sbin/init 在…

    Linux干货 2016-09-22

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-21 22:18

    文章对shell脚本的语法总结的很详细,同时也通过练习来加深自己对脚本的认识了,排版方面需要用点心思,希望写出优秀的博文。