玩转Bash脚本:循环结构之while循环(转)
和其他语言一样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循环(转)的更多相关文章
- 玩转Bash脚本:选择结构之case
总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,ca ...
- 玩转Bash脚本:test測试语句
总第1篇test就是測试的意思,经常使用在流程控制语句中作为条件.以下做一下介绍. 关于真值 与其它语言不同,Bash(包含其它Shell)中,是用0表示真,非0表示假的.之所以用0表示成功,而不是1 ...
- day_4流程控制之分支结构循环结构及for循环
复习一下昨天的内容 1:变量的命名规范 只能由数字 字母 及下划线组成 不能以数字开头 不能与系统关键字重名 _开头有特殊含义 __开头__结尾的变量是魔法变量 支持大小驼峰 ,但建议使用下划线连接语 ...
- 第十九节:Java基本数据类型,循环结构与分支循环
基本数据类型 Java中的基本数据类型,有8种,在Java中有四种类型,8种基本数据类型. 字节 boolean 布尔型为1/8 byte 字节类型为1 short 短整型为2 char 字符型为2 ...
- 循环结构之for循环
循环结构之for循环(一) 在很多编程语言中都有一种直接.简单的循环,它的一般形式为: 它的执行过程如下: 第一步:执行表达式1,对循环变量做初始化: 第二步:判断表达式2,若其值为真(非0),则执行 ...
- day04逻辑运算符短路、多分支结构(if和switch)、循环结构、while循环
复习 1.运算符和表达式 1)表达式 2)算数运算符 + - * / % 3)关系运算符 > < >= <= == != 4)逻辑运算符 && | ...
- 046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项 本文知识点:for循环的注意事项 for循环的注意事项 for循环有3个 ...
- 045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围 本文知识点:for循环应用及局部变量作用范围 for循环 w ...
- 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用
043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...
随机推荐
- Java程序员---技能树
计算机基础: 比如网络相关的知识. 其中就包含了 TCP 协议,它和 UDP 的差异.需要理解 TCP 三次握手的含义,拆.粘包等问题. 当然上层最常见的 HTTP 也需要了解,甚至是熟悉. 这块推荐 ...
- php删除
<?php$id = $_GET['id'];$db= new Mysqli("localhost","root","root",&q ...
- Python 打印嵌套list中每个数据(遍历列表)
new_list = ["H1","H2",1999] for each_list in new_list: print (each_list); 若列表中包含 ...
- iOS学习笔记21-推送证书与秘钥申请
---恢复内容开始--- 一.iOS证书 iOS常用的证书包括开发证书和发布证书,无论是真机调试还是最终发布应用到App Store这两个证书都是必须的,它是iOS开发的基本证书.Xcode7以后真机 ...
- 【Luogu】P2331最大子矩阵(DP)
题目链接 这题的状态转移方程真是粗鄙. f[i][j][k]表示前i行用了j个矩阵状态为k的时候的最大值. k=0:两列都不选. k=1:取左弃右. k=2:选右弃左. k=3:左右都选,但分属于两个 ...
- Luogu【P3609】蹄子剪刀布(DP+滚动数组)
题目链接 (突然高兴 又一次瞬间想出转移方程并一遍A掉!!233333(虽然从二叉苹果树那题开始我就发现我的方程好像跟别人不大一样 (所以这样就可以名正言顺的水题解了 设f[i][j][k]表示考虑F ...
- BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡 ——广义后缀自动机
神奇的性质,叶子节点不超过20个. 然后把这些节点提出来构成一颗新树,那么这些树恰好包含了所有的情况. 所以直接广义后缀自动机. 然后统计本质不同的字符串就很简单显然了. #include <c ...
- P2014 选课 (树形动规)
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
- 2>&1使用
2>&1使用 一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号 ...
- [其他] 关于C语言中使用未声明函数的问题
在c语言中,碰到一个.c文件,无.h头文件,在另一.c文件调用函数时,并没有进行声明extern, 此时编译器不会报错,会默认去查找同名的函数,这样会存在一些问题,查了些资料,稍微总结了下: 总结: ...