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

news2025/2/25 11:58:39

上回我们研究和探讨了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也没运行成功。

三、无限循环

(一)用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 ':'

echo '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.coloradmin.cn/o/1154038.html

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

相关文章

实时定位和配送追踪:开发万岳同城外卖APP的关键技术特性

随着生活节奏的不断加快&#xff0c;外卖服务已经成为许多人日常生活中不可或缺的一部分。无论是工作日的午餐&#xff0c;还是周末的家庭聚会&#xff0c;外卖APP已经成为满足各种美食需求的首选方式。然而&#xff0c;同城外卖APP的成功不仅仅取决于美味的食物选择&#xff0…

python 打印与去除不可见字符 \x00

# 此处不是真实的\x00 被 空格替换了 text "boot_1__normal/ " print(text.strip()"boot_1__normal/") # 打印不可见字符 print(repr(text))>>> False boot_1__normal/\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0…

[HGAME 2023 week1]Classic Childhood Game js前端查看

记录一下 给了我们一个游戏 按照web的尿性 都是要通关或者干嘛才可以 我们现在去看看js 这里发现结局的函数 window.setTimeout(function () {Message ["[Hero]玩家&#xff0c;恭喜你&#xff01;通关普通结局的纪元魔塔。", "[Npc3,仙子]谢谢支持&#xff…

私募机构全球化视野探析 | 活动回顾

10月21日&#xff0c;华锐技术、国泰君安证券和亚马逊云科技在深圳联合举办了一场主题为“私募机构全球化视野探析”的交流活动&#xff0c;广深及周边地区数十家机构近百人参会。本次活动众多行业大咖和专家从服务、技术、数据、资金等多个角度&#xff0c;共同探讨私募机构全…

【高效开发工具系列】你真的会使用Mac吗?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

leetcode第369周赛

2917. 找出数组中的 K-or 值 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums …

旅行社信息展示服务预约小程序的作用是什么

出行旅游近些年人次非常多&#xff0c;除了自己出行外&#xff0c;旅行社成为众多人的选择&#xff0c;而随着消费者线上信息获取度增加&#xff0c;因此对商家来说也需要线上发展实现赋能。 那么通过【雨科】平台做个旅行社小程序有什么效果呢&#xff1f; 1、品牌宣传、内容…

解决深度学习训练时使用tensorboard http://localhost:6006/无法访问此网站问题

在windows上跑yolov5模型使用了Tensorboard来查看训练过程&#xff0c;开始训练&#xff0c;终端就会提示 直接点击这个网址&#xff0c;就会出现 解决办法是重新开一个终端&#xff0c;激活目前正在使用的虚拟环境&#xff0c;在下面输入 tensorboard --logdir runs\train -…

项目赶工期,如何预防团队成员任务冲突?

项目赶工期时&#xff0c;如果发生任务冲突&#xff0c;往往会直接影响工作进度和效率&#xff0c;可能会导致任务的延误或错失关键节点&#xff0c;进而影响整个项目进度。因此预防团队成员任务冲突对于项目进度至关重要。它可以提高工作效率&#xff0c;保证项目进度&#xf…

Linux中的lrzsz 玩法

一、介绍 lrzsz是一款在Linux里可代替ftp上传和下载的程序&#xff0c;也就是一款软件。它是开发者常用的一款工具&#xff0c;这个工具用于windows机器和远端的Linux机器通过XShell传输文件。 二、lrzsz的安装 在安装之前&#xff0c;我们可以使用下述命令先查看yum仓库中是否…

cad怎么转换成pdf?

cad怎么转换成pdf&#xff1f;cad是什么格式&#xff1f;CAD是计算机辅助设计&#xff08;Computer-Aided Design&#xff09;的缩写&#xff0c;是一种用于制图和设计的软件。CAD软件可以帮助工程师、建筑师、设计师等专业人士创建和编辑各种类型的图形和设计&#xff0c;如平…

行云创新加入深圳市人工智能行业协会

近日&#xff0c;行云创新正式加入深圳市人工智能行业协会。标志着行云创新在人工智能领域的实力和影响力得到了市场更加广泛和深入的认可&#xff0c;展示了行云创新对于深入参与人工智能行业发展&#xff0c;以及与其他领先企业共同推动中国人工智能技术进步的坚定决心。 行…

leetcode:88. 合并两个有序数组(python3解法)

难度&#xff1a;简单 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&am…

HBuilderX实现安卓真机调试

1. 简介 HBuilderX 简称 HX&#xff0c;HBuilder&#xff0c;H 是 HTML 的缩写&#xff0c;Builder 是建设者。是为前端开发者服务的通用 IDE&#xff0c;或者称为编辑器。与 vscode、sublime、webstorm 类似。 它可以开发普通 web 项目&#xff0c;也可以开发 DCloud 出品的 u…

PowerDesigner 16数据库(mysql)逆向生成pdm

1、配置数据源 2、测试数据源 but~~~~没成功&#xff0c;shift

KaiwuDB 亮相第四届跨国公司领导人青岛峰会

10月10日至12日&#xff0c;由商务部和山东省人民政府共同主办的第四届跨国公司领导人青岛峰会在青岛国际会议中心举办。该峰会为跨国公司打造的国家级开放平台&#xff0c;是聚集跨国公司与中国合作、专注跨国公司议题、分享跨国公司经验、链接资源、促进合作的重大活动。Kaiw…

香港高端人才通行证计划学校名单更新扩容184所大全!

香港高端人才通行证计划学校名单更新扩容184所大全&#xff01; 近日香港特首在《施政报告》中宣布&#xff0c;将可以直接申请高端人才通行证计划B、C类的“世界百强名校”名单从176所增加到184所。 因为目前高才通是申请香港身份最快捷的途径&#xff0c;具有申请简单、审批迅…

【C语言】函数指针存疑调试及回调函数编写(结构体内的Callback回调函数传参和虚伪的回调函数__weak声明)

【C语言】函数指针存疑调试及回调函数编写&#xff08;结构体内的Callback回调函数传参和虚伪的回调函数__weak声明&#xff09; 文章目录 函数指针存疑调试函数指针函数调用 回调函数编写结构体内的回调函数虚伪的回调函数 附录&#xff1a;压缩字符串、大小端格式转换压缩字符…

企业3D虚拟展台在线生成工具的功能特点

3D虚拟云展平台提供的上千个素材模版&#xff0c;还有用户编辑和上传的成功案例&#xff0c;此外&#xff0c;三维营销编辑器支持在线选择展台模版、建筑物、产品、特效、动画、图文及视频等&#xff0c;也可以自行上传3D模型/图文视频素材到对应分区&#xff0c;选择自己准备的…

编程实例:操作简单物流快运单据打印软件,可以定制打印格式

编程实例&#xff1a;操作简单物流快运单据打印软件&#xff0c;可以定制打印格式 打印格式可以定制。 编程系统化课程总目录及明细&#xff0c;零基础学编程视频教程&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.20…