总第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. 与LCD_BPP相关的函数

    board/freescale/mx6q_sabresd/mx6q_sabresd.c:    panel_info.vl_bpix = LCD_BPP; common/lcd.c:   off  = ...

  2. 杭电 1159 Common Subsequence

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  3. 排序算法C语言实现——堆排序

    /*堆排nlog(n)*//*堆排复杂度分析1.建堆((n*log(n))/2)    循环n/2次,每次调用HeapAdjust函数    HeapAdjust内部循环log(n)2.调整堆(((n ...

  4. 关于springmvc返回json格式数据

    1.引入maven依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifac ...

  5. strcat strcpy 源代码,用指针去实现

    15. 指针实现 strcmp函数     •    int newStrcpy(char *p, char *q)     •    {     •        while(*p ==*q) { ...

  6. angularJs模块ui-router之多视图

    可以给ui-view指定名称,这样一个模板中就可以有多个ui-view.假设您有一个应用,需要动态填充graph.table data和filters,像下面这样: 当您需要使用多视图时,需要用到状态 ...

  7. linux实时查看更新日志命令

    很多时候在调试生成或正式平台服务器的时候想查看实时的日志输出,在Linux中可以使用tail 或 watch来实现. 比如我们项目中有个 app.log 的日志文件,我们普通读取都使用 vi app. ...

  8. CF Educational Codeforces Round 21

    A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. [Kubernetes]容器健康检查和恢复机制

    在Kubernetes中,可以为Pod里的容器定义一个健康检查探针(Probe),这样Kubernetes会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否允许(来自Docker返回 ...

  10. redis2.3.7安装时出现undefined reference to `clock_gettime'

    (转自:http://blog.csdn.net/qq_28779503/article/details/54844988) undefined reference to `clock_gettime ...