总第8篇
本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html

和其他语言一样Bash的循环结构中也有while语句。

基本结构

 while 条件
do
循环体
done

和for语句一样,它的循环体同样是do…done结构。我们可以把while语句再折叠一下

 while 条件;do
循环体
done

还能进一步折叠成一行体

 while 条件;do 循环体;done

Bash语句大都可以写作一行,只不过可读性差

和其他编程语言不同的是,Bash中的while语句用法是比较多样的。可以根据while条件的不同,将while语句分为几类。

while条件

方括号[ ]

和if语句的条件相同。即操作符[ ]。关于[ ]的用法请参考之前的文章。

 #!/bin/bash
n=
while [ $n -le ]
do
echo $n
let n++ #或者写作n=$(( $n + ))
done

在前面的文章中,已经讲过了操作符[ ]和test语句是等价的,所以这里也可以用test语句来作条件。

终端命令

while的条件可以是各种终端的命令。包括外部命令或bash内建(built-in)命令都可以。因为命令都是有返回值的(可以用echo $?查看),命令执行的成功与否就是while条件的真或假。

以read命令来举个例子

 #!/bin/bash
while read var;do
echo "您输入的是$var"
done

这个程序是个死循环,将不停地等待您的输入,并回显出来。

这里的命令可以是单个命令也可以是组合命令,比如用逻辑连接符连接的命令,或者管道、重定向组成的长命令

死循环

除了让while条件恒成立外,编程语言都有一种简洁的死循环写法。比如C语言中典型的死循环条件是while(1),而java中的写法是while(true)。 
而Bash中的写法则简单的多,只需要一个冒号。

 #!/bin/bash
while :
do
echo I love you forever
done

这是一个死循环,执行之后请用按组合键Ctrl+C来终止它。 
此外,还有一种死循环写法就是利用系统自带的true命令(/bin/true)

 #!/bin/bash
while /bin/true
do
echo I love you forever
done

由于我们的系统环境变量(PATH)中一般都包含了路径/bin,所有我们也可以简写成while true

while实现菜单demo

我们或许曾经用C/C++在控制台上输出过菜单。这通常是一个do-while循环实现的,先输出菜单的每个选项,然后等待输入, 
根据不同的输入执行不同的操作,然后循环再次输出菜单……。 
bash中没有do-while风格的循环,但是我们很容易用替代的方案实现该功能。用死循环+if/case条件判断语句就够了。

 #!/bin/bash
#菜单demo
while :
do
echo #输出空行
echo "========================="
echo " 1:输出成绩单"
echo " 2:输出课程表"
echo " 3:输出空闲教室"
echo " q:退出菜单"
echo "========================="
read -p"请输入:" input
case $input in
)echo "稍等,正在为您输出成绩单";;
)echo "稍等,正在为您输出课程表";;
)echo "稍等,正在为您输出空闲教";;
q|Q) exit
esac
done

while与重定向

while语句可以联合重定向(>和<)一起使用。

while和输入重定向<

格式为

 while 命令
do
循环体
done < 文件名

相当于将文件内容逐行传递给while后面的命令(类似管道),然后再执行循环体。 
当循环体为空的时候,这个结构的功能通常和cat没有两样,比如:

 while grep "love"
do
done < letter

从文件letter中查找love这个单词,其实和cat letter|grep “love”没什么两样。

这个结构更习惯的用法和read联用,来将文件内容逐行取出,赋值给read后面的变量。比如:

 #!/bin/bash
#从/etc/passwd文件中读取用户名并输出
oldIFS=$IFS #IFS是文件内部分隔符
IFS=":" #设置分隔符为:
while read username var #var变量不可少
do
echo "用户名:$username"
done < /etc/passwd
IFS=$oldIFS

熟悉/etc/passwd文件结构的朋友都知道这个文件的每一行包含了一个用户的大量信息(用户名只是第一项)。 
这里我们实际只输出了用户名。但是注意while的read后面除变量username外还有个var,尽管我们并不输出这个变量的值。 
但它却必不可少,如果我们写成while read username那么username的值等于passwd文件这一整行的内容(IFS=”:”也就不起作用了)

bash中,只有当有多个变量要从一行文本赋值的时候,才尝试去用IFS来分割,然后赋值。

while和输出重定向>

格式为

 while 命令
do
循环体
done > 文件名

这个结构会将命令的输出,以及循环体中的标准输出都重定向到指定的文件中。 
比如:

 #!/bin/bash
#每隔10分钟,ping一下局域网内主机192.168.1.,
#并把结果记录到ping.txt文件中
while date
do
ping -c5 192.168.1.101 >/dev/null >&
if [ $? = ];then
echo OK
else
echo FAIL
fi
sleep #600秒是10分钟
done > ping.txt

我们来cat一下ping.txt文件,看一看:

2015年 01月 31日 星期六 16:03:13 CST
OK

这是ping.txt中的一条记录

本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html

玩转Bash脚本:循环结构之while循环(转)的更多相关文章

  1. 玩转Bash脚本:选择结构之case

    总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,ca ...

  2. 玩转Bash脚本:test測试语句

    总第1篇test就是測试的意思,经常使用在流程控制语句中作为条件.以下做一下介绍. 关于真值 与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的.之所以用0表示成功,而不是1 ...

  3. day_4流程控制之分支结构循环结构及for循环

    复习一下昨天的内容 1:变量的命名规范 只能由数字 字母 及下划线组成 不能以数字开头 不能与系统关键字重名 _开头有特殊含义 __开头__结尾的变量是魔法变量 支持大小驼峰 ,但建议使用下划线连接语 ...

  4. 第十九节:Java基本数据类型,循环结构与分支循环

    基本数据类型 Java中的基本数据类型,有8种,在Java中有四种类型,8种基本数据类型. 字节 boolean 布尔型为1/8 byte 字节类型为1 short 短整型为2 char 字符型为2 ...

  5. 循环结构之for循环

    循环结构之for循环(一) 在很多编程语言中都有一种直接.简单的循环,它的一般形式为: 它的执行过程如下: 第一步:执行表达式1,对循环变量做初始化: 第二步:判断表达式2,若其值为真(非0),则执行 ...

  6. day04逻辑运算符短路、多分支结构(if和switch)、循环结构、while循环

    复习 1.运算符和表达式 1)表达式 2)算数运算符 + - * / % 3)关系运算符 >  <  >=  <=  ==  != 4)逻辑运算符 &&   | ...

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

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

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

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

  9. 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用

    043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...

随机推荐

  1. (转)ios截取屏幕代码

    本文转自http://blog.sina.com.cn/s/blog_801997310101a769.html 截取本区域(self.view): UIGraphicsBeginImageConte ...

  2. i.mx53开发的一些问题

    i.mx53开发的一些问题 转载于此:http://blog.csdn.net/shell_albert/article/details/8242288   原来i.mx53上4GB的Nand Fla ...

  3. python基础——12(包的概念)

    一.模块 1.模块的加载顺序 加载顺序:内存-->内置-->sys.path(一系列自定义模块) import sys sys.path  #环境变量:存放文件路径的列表 重点:默认列表的 ...

  4. linux中软件包管理

    一.流行的软件包管理有两种: Debian Linux的Deb软件包和 Redhat Linux的Rpm软件包, Debian Linux首先提出将应用程序的二进制文件.配置文档.man/info帮助 ...

  5. arrive 和reach 的区别

    例如:He arrived yesterday. 没宾语的话就用arrive了reach作抵达讲时是及物动词,后面要宾语的 分清arrive和reach的区别arrive是不及物动词,后面不能直接加地 ...

  6. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  7. 【bzoj4200】[Noi2015]小园丁与老司机 STL-map+dp+有上下界最小流

    题目描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 nn 棵许愿树,编号 1,2,3,…,n1,2,3,…,n,每棵树可以看作平面上的一个点,其中第 ii 棵树 (1≤ ...

  8. bzoj3000 Big Number 数论,斯特林公式

    Description 给你两个整数N和K,要求你输出N!的K进制的位数. Input 有多组输入数据,每组输入数据各一行,每行两个数——N,K Output 每行一个数为输出结果 Sample In ...

  9. python和scrapy的安装【转:https://my.oschina.net/xtfjt1988/blog/364577】

    抓取网站的代码实现很多,如果考虑到抓取下载大量内容scrapy框架无疑是一个很好的工具.Scrapy = Search+Pyton.下面简单列出安装过程.PS:一定要按照Python的版本下载,要不然 ...

  10. jenkins执行自动化用例(详细、有用、mark 优先级高高高)

    http://blog.sina.com.cn/s/blog_68f262210102vx8o.html 第七章 测试用例接入jenkins自动运行 ------Web自动化测试之Webdriver+ ...