总第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. 用btrace定位问题

    btrace 截取方法出入参 用btrace的手法,网上有很多.简单记录下我自己的使用经历. btrace脚本: import static com.sun.btrace.BTraceUtils.ex ...

  2. lua-helloworld

    write script file, a.lua: #!/usr/bin/lua print("hello world!") add excutable prperty to th ...

  3. Android点击按钮拨打电话

    代码改变世界 Android点击按钮拨打电话 public void callPhone(String str) { Intent intent=new Intent(); intent.setAct ...

  4. arc和mrc混用

    arc项目中引用非arc代码   加上“-fno-objc-arc” 非arc项目中引用arc代码 加上“-fobjc-arc”

  5. iOS学习笔记14-网络(三)WebView

    一.WebView WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在i ...

  6. 【Luogu】P1280尼克的任务(DP)

    做顺序DP做惯了,死活没想到这是个倒序DP. f[i]表示时刻i的最大空闲时.有以下两种可能. 1.时刻i没有任务.此时f[i]=f[i+1]+1; 2.时刻i有许多任务.此时f[i]=max(f[i ...

  7. 周赛Problem 1108: 蛋糕(二分)

    1108: 蛋糕 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 17  Solved: 4 Description 杨神打代码打得有点疲倦,于是他想要 ...

  8. Java中NIO、BIO、AIO相关概念及应用场景

    1.同步阻塞IO(JAVA BIO):同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通 ...

  9. Python脚本实现单据体首行过滤

    编写的Python脚本 可以看到,实际代码只有3句,即实现单据体首行过滤代码(其实最最主要的是无需写组件动态即时注册),并有注册到[采购订单]"表单构建插件"上.界面运行时,实际效 ...

  10. uva 10710 快速幂取模

    //题目大意:输入一个n值问洗牌n-1次后是不是会变成初始状态(Jimmy-number),从案例可看出牌1的位置变化为2^i%n,所以最终判断2^(n-1)=1(mod n)是否成立#include ...