Linux shell编程学习笔记18:while循环语句

上回我们研究和探讨了Linux shell编程中for 循环语句,与在C/C++中一样,for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。

一、数字条件循环

我们继续以for循环语句中的例子,计算 从1到10与2的乘积 并输出。

(一)常规写法

1.在zsh命令行中

# csdn @ edu in ~ [20:35:57] 
$ i=1; while (( $i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; i=$(expr $i + 1); done
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20

# csdn @ edu in ~ [20:36:21] 

2.在bash命令行中

[csdn ~]$ i=1; while (( $i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; i=$(expr $i + 1); done
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20

3.注意

表达式 $(expr $i \* 2)     中 \* 前后要用空格与操作数分隔,表达式 i=$(expr $i + 1)  中 + 前后要用空格与操作数分隔,否则结果就会出错。

(二)使用++运算符来改变循环变量

对于经常使用i++、i--运算符的程序员来说,使用i=i+1多多少少有些别扭。

由于i++或++i是表达式而不是命令,所以我们在使用这种表达式时要变通一下。

1.通过let命令来使用++运算符

(1)在zsh命令行中

# csdn @ edu in ~ [21:08:50] 
$ i=1; while (( $i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; let i++; done
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20

# csdn @ edu in ~ [21:09:03] 

 

 (2)在bash命令行中

[csdn ~]$ i=1; while (( $i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; let i++; done
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
[csdn ~]$ 

2.在循环条件表达式中用++修改循环变量值 

(1)在zsh命令行中

# csdn @ edu in ~ [21:21:29] 
$ i=1; while (( i++ <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
11 * 2 = 22

# csdn @ edu in ~ [21:21:40] 

(2)在bash命令行中

[csdn ~]$ i=1; while (( i++ <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
11 * 2 = 22
[csdn ~]$ 

3. 在循环条件表达式中利用 && 和 ++修改循环变量值 

(1)在zsh命令行中

# csdn @ edu in ~ [21:31:12] 
$ i=0; while (( i++ && i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done

# csdn @ edu in ~ [21:38:46] 
$ i=0; while (( ++i && i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20

# csdn @ edu in ~ [21:39:10] 

(2)在bash命令行中

[csdn ~]$ i=0; while (( i++ && i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done
[csdn ~]$ i=0; while (( ++i && i <= 10 )) ; do  echo "$i * 2 = $(expr $i \* 2)"; done
1 * 2 = 2

2 * 2 = 4
3 * 2 = 6
4 * 2 = 8
5 * 2 = 10
6 * 2 = 12
7 * 2 = 14
8 * 2 = 16
9 * 2 = 18
10 * 2 = 20
[csdn ~]$ 

(3)注意

在上面的实例中,使用 i++ && i <= 10 作为循环条件表达式时,没有输出结果。

使用  ++i && i <= 10  作为循环条件表达式才能正确输出结果。

二、字符条件类循环

(一)实例1

我们先定义一个数组s=(b d 3 0),并以0作为最后一个数组元素,然后定义循环变量i并初始化,接着使用while循环逐一访问数组s的成员值并输出,如果成员值 是小写字母,就是输出提示is a lowercase letter,否则输出提示is not a letter,直到遇到最后一个数组元素0,循环结束。

1.zsh中

命令行为:

s=(b d 3 0); i=1; while [[ ${s[i]} != '0' ]] ; do if [[ ${s[i]} > 'a' && ${s[i]} < 'z' ]]; then echo ${s[i]} is a lowercase letter; else echo ${s[i]} is not a letter; fi; let i++; done

由于CSDN程序员研修院提供的linux环境不能让以上命令完整显示,所以我们分几行输入:

# csdn @ edu in ~ [12:23:33] 
$ s=(b d 3 0); i=1; while [[ ${s[i]} != '0' ]] ; 
while> do if [[ ${s[i]} > 'a' && ${s[i]} < 'z' ]]; then echo ${s[i]} is a lowercase letter; else echo ${s[i]} is not a letter; fi; 
while> let i++;
while> done
b is a lowercase letter
d is a lowercase letter
3 is not a letter

# csdn @ edu in ~ [12:24:31] 

 

注意:在zsh中,数组下标是从1开始的。所以上例中数组下标变量i的初始值为1。

2.在bash中

s=(b d 3 0); i=0; while [[ ${s[i]} != '0' ]] ; do if [[ ${s[i]} > 'a' && ${s[i]} < 'z' ]]; then echo ${s[i]} is a lowercase letter; else echo ${s[i]} is not a letter; fi; let i++; done

user @ host : ~ $ s=(b d 3 0); i=0; while [[ ${s[i]} != '0' ]] ; do if [[ ${s[i]} > 'a' && ${s[i]} < 'z' ]]; then echo ${s[i]} is a lowercase letter; else echo ${s[i]} is not a letter; fi; let i++; done
b is a lowercase letter
d is a lowercase letter
3 is not a letter
user @ host : ~ $ ^C

注意:在bash中,数组下标是从0开始的。所以上例中数组下标变量i的初始值为0。

(二)实例2

定义字符串s=abcd0,初始化循环变量i,然后从i开始截取字符串s值并输出,直到截取的字符串为0时结束循环。

1.在bash命令行中执行成功

[csdn ~]$ s=abcd0; i=0; while [[ ${s:i} != '0' ]] ; do echo ${s:i}; let i++; done 
abcd0
bcd0
cd0
d0
[csdn ~]$ 

2.在zsh中执行不成功

(1)在zsh命令行执行不成功

# csdn @ edu in ~ [13:03:22] 
$ s=abcd0; i=1; while [[ ${s:i} != '0' ]] ; do echo ${s:i}; let i++; done
zsh: unrecognized modifier `i'

# csdn @ edu in ~ [13:03:26] C:1
$ s=abcd0; i=1; while [[ ${s:$i} != '0' ]] ; do echo ${s:i}; let i++; done
zsh: unrecognized modifier `i'

# csdn @ edu in ~ [13:03:32] C:1
$ s=abcd0; i=1; while [[ ${ s:${i} } != '0' ]] ; do echo ${s:i}; let i++; done
zsh: bad substitution

# csdn @ edu in ~ [13:03:54] C:1
$ s=abcd0; i=1; while [[ ${s:${i}} != '0' ]] ; do echo ${s:i}; let i++; done 
zsh: unrecognized modifier `i'

# csdn @ edu in ~ [13:04:01] C:1
$ s=abcd0; i=1; while (( ${s:${i}} != '0' )) ; do echo ${s:i}; let i++; done
zsh: bad math expression: operand expected at `'0' '

# csdn @ edu in ~ [13:04:11] 
$ s=abcd0; i=1; while (( ${s:i} != '0' )) ; do echo ${s:i}; let i++; done 
zsh: unrecognized modifier `i'

# csdn @ edu in ~ [13:04:22] 
$ s=abcd0; i=1; while (( ${s:$i} != '0' )) ; do echo ${s:i}; let i++; done
zsh: bad math expression: operand expected at `'0' '

# csdn @ edu in ~ [13:04:30] 

(2)写入脚本文件在zsh中执行出错

# csdn @ edu in ~ [14:50:09] C:126
$ echo '#!/bin/zsh' > a.sh

# csdn @ edu in ~ [14:50:51] 
$ echo i=1 >> a.sh

# csdn @ edu in ~ [14:50:51] 
$ echo 'while [[ ${s:i} != '0' ]]' >> a.sh 

# csdn @ edu in ~ [14:50:51] 
$ echo do  >> a.sh

# csdn @ edu in ~ [14:50:51] 
$ echo 'echo ${#s:i}'  >> a.sh

# csdn @ edu in ~ [14:50:51] 
$ echo 'let i++;'   >> a.sh

# csdn @ edu in ~ [14:50:51] 
$ echo done >> a.sh 

# csdn @ edu in ~ [14:50:53] 
$ cat a.sh
#!/bin/zsh
i=1
while [[ ${s:i} != 0 ]]
do
echo ${#s:i}
let i++;
done

# csdn @ edu in ~ [14:50:57] 
$ . ./a.sh
./a.sh:3: unrecognized modifier `i'

我们利用echo 配合输出重定向创建了脚本文件a.sh,但脚本文件a.sh也没运行成功。

三、无限循环

我们用无限循环每隔30秒显示提示信息 press Ctrl+C to exit,在用户按下Ctrl+C后结束循环。 

(一)用true作为循环表达式

1.在zsh命令行执行

# csdn @ edu in ~ [15:06:21] 
$  while true; do echo 'press Ctrl+C to exit'; sleep 30s; done
press Ctrl+C to exit
press Ctrl+C to exit
press Ctrl+C to exit
press Ctrl+C to exit
^C%                                                                                                                                                                                              

# csdn @ edu in ~ [15:08:23] C:130

2.在bash命令行执行

[csdn ~]$ while true; do echo 'press Ctrl+C to exit'; sleep 30s; done
press Ctrl+C to exit
press Ctrl+C to exit
^C
[csdn ~]$ 

在上面的例子中,为了避免提示信息 press Ctrl+C to exit 刷屏,我们使用了命令:

sleep 30s

来等待30秒钟。

(二)使用冒号(:) 作为循环表达式

1.冒号(:)表达式或命令的作用

在Linux中,冒号(:) 有很多种用法,其中之一是作为空表达式或空命令,返回值为0。

我们可以创建一个包含以下两条命令的脚本文件a.sh 来观察冒号(:)作为空命令执行时的返回值(保存在$?中)。

:echo $?

脚本文件创建和执行情况:

# csdn @ edu in ~ [15:22:38] 
$ echo ':' > a.sh      

# csdn @ edu in ~ [15:23:20] 
$ echo 'echo $?'>> a.sh

# csdn @ edu in ~ [15:23:27] 
$ cat a.sh
:
echo $?

# csdn @ edu in ~ [15:23:33] 
$ . ./a.sh             
0

# csdn @ edu in ~ [15:23:36] 

2.在zsh命令行执行

# csdn @ edu in ~ [15:08:23] C:130
$  while : ; do echo 'press Ctrl+C to exit'; sleep 30s; done
press Ctrl+C to exit
press Ctrl+C to exit
press Ctrl+C to exit
^C%                                                                                                                                                                                              

# csdn @ edu in ~ [15:12:29] C:130

3.在bash命令行执行

# csdn @ edu in ~ [15:13:11] C:130
$ exec bash
[csdn ~]$ while : ; do echo 'press Ctrl+C to exit'; sleep 30s; done
press Ctrl+C to exit
press Ctrl+C to exit
^C
[csdn ~]$ 

一般推荐使用冒号(:) 作为循环表达式的无限循环,因为使用冒号(:)命令系统资源开销更小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/127741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅述青犀AI算法人体攀爬行为检测的应用场景及解决方案

人体攀爬行为检测是指利用计算机视觉技术对人类攀爬物体的行为进行识别和分析。该技术主要依靠图像和视频数据进行分析&#xff0c;通过识别人类身体的各个部位&#xff0c;以及其在攀爬过程中的动作和姿态&#xff0c;实现对攀爬行为的检测和跟踪。该技术的场景应用比较广泛&a…

(2)STM32单片机上位机

使用VX小程序开发上位机&#xff0c; 样式如何创建&#xff1f; 在你所在页面 开辟空间 使用 view 在view 中 输入class 就是样式&#xff0c;在编辑样式的时候&#xff0c;如何寻找哪一块的样式 就是通过这个class寻找的 按钮使用switch

算法训练 第五周

一、多数元素 本题给了我们一个数组&#xff0c;要求我们找出这个数组中出现次数大于这个数组元素总量一半的那个元素&#xff0c;也可以理解为找出数组中出现次数最多的那个元素&#xff0c;本题的解决方法有很多&#xff0c;在此我们主要讨论三种解决思路。 1.Hash表 我们可…

Scala基本数据类型和运算符

1.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型&#xff0c;其中 Byte、Short、Int、Long 和 Char 类型统称为整数类型&#xff0c;整数类型加上 Float 和 Double 统称为数值类型。Scala 数值类型的取值范围和 Java 对应类型的取值范围相同。 数据类型 描述 Byte 8 …

百度竞价排名推广对比自然排名哪一个更具优势-华媒舍

在搜索引擎结论网页页面&#xff08;SERP&#xff09;中&#xff0c;我们经常会看到一些网站链接及其广告栏。这种连接一般分为两种类型&#xff1a;百度竞价推广排名推广与自然排名。究竟哪个更有优势&#xff1f;本文将对这几种排名形式进行科谱详细介绍。 什么叫百度竞价推广…

百度 | 文心一言也开始收费了

好久没用文心一言了 之前一直用ChatGPT的 今天打开文心一言一看&#xff0c;好家伙 出了文心大模型4.0&#xff0c;想体验一下来着 可惜是收费的 看下价格&#xff0c;没买 50块钱一个月&#xff0c;对比ChatGPT4来说&#xff0c;确实不算贵 毕竟gpt4一个月20美刀 &#xff0c;…

LEEDCODE 709转换成小写字母

class Solution { public:string toLowerCase(string s) {int len s.length();string a "";for(int i 0; i < len; i){if(s[i] > 65 && s[i] < 90){a (s[i] 32);}elsea s[i];}// cout<<a<<endl;return a;} };

Docker Compose部署Spug:实现内网穿透

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

Mac 安装使用NPM及常用命令

环境&#xff1a; Mac 工具&#xff1a; NPM 可通过官网查询一些模块相关 NPM Doc 通过官网文档了解更多的关于NPM的使用 安装 NPM是Node.js的包管理工具&#xff0c;可用于解决 Node.js在代码部署上的问题。 新版本的Node.js已经集成了NPM&#xff0c; 因此可通过下载 Nod…

安全架构的设计理论与实践

安全架构的设计理论与实践 安全架构概述 信息安全面临的威胁 安全架构的定义和范围 信息安全相关的国内外标准及组织 主要安全模型 状态机模型(BLP)模型 Bell-IaPadula模型 Biba模型 Clark-Wilson (CWM)模型 ChineseWall模型 系统安全体系架构规划框架 安全技术体系架构 信息系…

浏览器请求http地址,自动跳转成https

谷歌浏览器&#xff1a; 点击url地址左侧的锁&#xff0c;选择【网站设置】 点击【隐私和安全】&#xff0c;将【不安全内容】改为允许&#xff0c;然后刷新即可

kill-port,跨平台解决端口占用问题

在日常开发中&#xff0c;端口占用问题一直是令人头疼的难题。为了更高效地管理端口资源&#xff0c;开发者们经常需要一种快速而可靠的解决方案。在这方面&#xff0c;kill-port 的出现为我们提供了一种强大而便捷的工具。本篇博客将深入介绍 kill-port 解决端口占用问题的优势…

GPT的广泛应用会对互联网公司造成挑战吗?——探讨GPT在实际使用中的应用和影响

文章目录 前言GPT 技术的背景和发展历程GPT 技术对互联网行业的影响GPT 技术在互联网行业中的应用GPT 技术对于用户隐私和数据安全的威胁GPT 技术对于人类工作岗位的影响加强 AI 伦理和监管加强 AI 安全性和隐私保护推动 AI 创新和发展&#xff0c;避免过度依赖 AIGPT 技术是一…

图片批量添加文件名水印

图片现在需要批量添加水印很简单&#xff0c;但是需要添加的水印内容为文件名称比较麻烦。 同时有些能添加文件名称的又有后缀例如&#xff08;.jpg、.png等等&#xff09; 这里有个软件可以选择是否加后缀&#xff0c;或者使用图片文件大小来当水印都可以。

React Hooks的使用

目录 1.React Hooks使用注意事项 1.useState Hook&#xff1a; 2.useEffect Hook&#xff1a; 3.其他常用Hooks&#xff1a; 2.使用React Hooks需要遵循 1.安装React&#xff1a; 2.导入所需的Hooks&#xff1a; 3.使用Hooks创建组件&#xff1a; 4.在应用中使用组件&…

lua-resty-request库写入爬虫ip实现数据抓取

根据提供的引用内容&#xff0c;正确的库名称应该是lua-resty-http&#xff0c;而不是lua-resty-request。使用lua-resty-http库可以方便地进行爬虫&#xff0c;需要先安装OpenResty和lua-resty-http库&#xff0c;并将其引入到Lua脚本中。然后&#xff0c;可以使用lua-resty-h…

PLSql调试问题解析

最近因为工作问题需要弄一个Orale数据库导出Dmp文件&#xff0c;直接命令行执行很麻烦&#xff0c;于是用PLSql来操作&#xff0c;在配置链接的过程中遇到很多问题&#xff0c;下面把问题及解决方法贴在这里记录一下 1、ORA-12504&#xff1a;TNS&#xff1a;监听程序在CONNEC…

深度学习之基于ResNet18的神经网络水果分类系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、神经网络水果分类系统四. 总结 一项目简介 基于ResNet18神经网络的水果分类系统是一个利用深度学习技术进行水果图像分类的系统。下面是该系统…

【Proteus仿真】【Arduino单片机】SG90舵机控制

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用SG90舵机等。 主要功能&#xff1a; 系统运行后&#xff0c;舵机开始运行。 二、软件设计 /* 作者&#xff1a;嗨小易&#xff08;QQ&#x…