Linux shell编程学习笔记17:for循环语句

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。 
之前我们探讨了if语句,现在我们来探讨for循环语句。

Linux Shell中的for语句十分灵活,格式多样,我们通过实例看看一些常用的格式。

一、数字条件类循环

(一)格式1:C语言风格

# csdn @ edu in ~ [22:14:49] 
$ for (( i=1; i <=10; i++));  do           
for> echo "$i * 2 = $(expr $i \* 2)";      
for> 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 ~ [22:15:25] 

(二)格式2:in + 完整数列

1.在zsh中 

# csdn @ edu in ~ [23:22:07] C:127
$ for i in 1 2 3 4 5 6 7 8 9 10; do                                       
for> echo "$i * 2 = $(expr $i \* 2)";       
for> 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 ~ [23:22:44] 

2.在bash中

[csdn ~]$ for i in 1 2 3 4 5 6 7 8 9 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:使用 in + seq集合

# csdn @ edu in ~ [23:27:05] 
$ for i in $(seq 1 10) ; do
for> echo "$i * 2 = $(expr $i \* 2)"; 
for> 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 ~ [23:28:42] 

(四)格式4:用 in + {..}集合

1.多余空格导致错误

# csdn @ edu in ~ [23:36:02] 
$ for i in {1..10};  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do
zsh: command not found:  do

导致出错的原因是命令

for i in {1..10};  do

中的 }; 和行末的 do 之间多放了几个空格,只需要一个空格就行。

2.正确的格式

# csdn @ edu in ~ [23:36:09] C:127
$ for i in {1..10}; do 
for> echo "$i * 2 = $(expr $i \* 2)";
for> 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 ~ [23:36:47] 

 (五)格式5:在awk中应用

# csdn @ edu in ~ [22:41:42] 
$ awk 'BEGIN {for( i=1; i<=10; i++ ) print i "*2=" i*2}'
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 ~ [22:41:57] 

二、字符条件类循环

(一)格式1:in 字符串

1.在bash中有效

[csdn ~]$ s="b d 3";for i in $s; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done
b is a lowercase letter
d is a lowercase letter
3 is not a letter
[csdn ~]$  

 2.在zsh中无效 

[csdn ~]$ exec zsh

# csdn @ edu in ~ [14:00:44] 
$ s="b d 3";for i in $s; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done
b d 3 is a lowercase letter

# csdn @ edu in ~ [14:00:55] 

(二)格式1:in 字符1 字符2 …… 字符n

1.在bash中部分有效

# csdn @ edu in ~ [14:26:43] 
$ exec bash
[csdn ~]$ for i in 'b' 'd' '3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done
b is a lowercase letter
d is a lowercase letter
3 is not a letter
[csdn ~]$ for i in b d 3; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done 

> ^C
[csdn ~]$ for i in 'b d 3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done ; 
> ^C
[csdn ~]$ for i in "b d 3"; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done ; 
> ^C
[csdn ~]$ for i in "b d 3"; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done 
> ^C
[csdn ~]$ 

2.在zsh中有效

# csdn @ edu in ~ [14:24:52] 
$ for i in 'b' 'd' '3'; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done
b is a lowercase letter
d is a lowercase letter
3 is not a letter

# csdn @ edu in ~ [14:25:11] 
$ for i in b d 3; do if [[ $i > 'a' && $i < 'z' ]]; then echo $i is a lowercase letter; else echo $i is not a letter; fi; done 
b is a lowercase letter
d is a lowercase letter
3 is not a letter

# csdn @ edu in ~ [14:26:43] 

(三)格式3:in {..}

1.在bash中有效

[csdn ~]$ for i in {b..d}; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
b is a letter
c is a letter
d is a letter
[csdn ~]$ 

或者

for i in {b..d}; do if [[ $i > 'a' && $i < 'z' ]]; then echo "$i is a letter"; else echo "$i is not a letter"; fi; done

 这条命令在csdn的linux学习环境中显示如下:

2.在zsh中无效

[csdn ~]$ exec zsh

# csdn @ edu in ~ [21:58:49] 
$ for i in {b..d}; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
{b..d} is not a letter

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

 

  

(四) in [ 字母1,字母n ]

注意: [后面和] 的前面加了空格

1.在bash中

[csdn ~]$ for i in [ b,d ]; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
[ is not a letter
b,d is a letter
] is not a letter
[csdn ~]$  

2.在zsh中

# csdn @ edu in ~ [23:08:28] 
$ for i in [ b,d ]; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
[ is not a letter
b,d is a letter
] is not a letter

# csdn @ edu in ~ [23:12:14] 

(五) in [ 字母1 , 字母n ]

注意:[ 字母1 , 字母n ] 之间均有空格间隔。

1.在bash中

[csdn ~]$ for i in [ b , d ]; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
[ is not a letter
b is a letter
, is not a letter
d is a letter
] is not a letter
[csdn ~]$ 

2.在zsh中

[csdn ~]$ exec zsh

# csdn @ edu in ~ [23:08:21] 
$ for i in [ b , d ]; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
[ is not a letter
b is a letter
, is not a letter
d is a letter
] is not a letter

(六)一些无效的格式

1.in 字母1-字母n

(1)在basth中

# csdn @ edu in ~ [22:36:03] 

$ exec bash
[csdn ~]$ for i in b-d; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
b-d is a letter
[csdn ~]$ 

(2)在zsh中

# csdn @ edu in ~ [22:01:51] 
$ for i in b-d; do  
  if [[ $i > 'a' && $i < 'z' ]]; then
   echo "$i is a letter";
  else
   echo "$i is not a letter";
  fi;
done
b-d is a letter

# csdn @ edu in ~ [22:02:09] 

2. in [字母1-字母n]

(1)在bash中

[csdn ~]$ for i in [b-d]; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
[b-d] is a letter

(2)在zsh中

# csdn @ edu in ~ [22:25:27] 
$ for i in [b-d]; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
zsh: no matches found: [b-d]

# csdn @ edu in ~ [22:28:11] 

3. in [字母1,字母n]

(1)在bash中


[csdn ~]$ for i in [b,d]; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
[b,d] is a letter
[csdn ~]$ 

 

 (2)在zsh中

# csdn @ edu in ~ [22:29:14] 
$ for i in [b,d]; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
zsh: no matches found: [b,d]

# csdn @ edu in ~ [22:33:29] 


 

4. in '字母1-字母n'

(1)在bash中 

[csdn ~]$ for i in 'b-d'; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
b-d is a letter
[csdn ~]$ 

 (2)在zsh中

# csdn @ edu in ~ [22:33:29] 
$ for i in 'b-d'; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
b-d is a letter

# csdn @ edu in ~ [22:36:03] 

5. in '字母1'-'字母n'

(1)在bash中

[csdn ~]$ for i in 'b'-'d'; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
b-d is a letter
[csdn ~]$ 

 

(2)在zsh中

# csdn @ edu in ~ [22:46:27] 
$ for i in 'b'-'d'; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
b-d is a letter

# csdn @ edu in ~ [22:46:35] 

6.in ['字母1'-'字母n']

(1)在bash中

# csdn @ edu in ~ [22:51:56] 
$ exec bash
[csdn ~]$ for i in ['b'-'d']; do
>   if [[ $i > 'a' && $i < 'z' ]]; then
>    echo "$i is a letter";
>   else
>    echo "$i is not a letter";
>   fi;
> done
[b-d] is a letter
[csdn ~]$ 

(2)在zsh中

# csdn @ edu in ~ [22:51:06] 
$ for i in ['b'-'d']; do
for>   if [[ $i > 'a' && $i < 'z' ]]; then
for then>    echo "$i is a letter";
for then>   else
for else>    echo "$i is not a letter";
for else>   fi;
for> done
zsh: no matches found: [b-d]

# csdn @ edu in ~ [22:51:56] 

三、文件和目录类循环操作

 (一)实例1:列出根目录/下的内容,判断其是文件还是目录并输出

# csdn @ edu in ~ [11:39:57] C:1
$ cd /

# csdn @ edu in / [11:40:01] 
$ ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# csdn @ edu in / [11:40:04] 
$ for i in `ls`; do if [ -f $i ]; then echo $i is a file\! ; elif [ -d $i ]; then echo $i is a directory\! ; else echo $i is other file\!; fi; done
anaconda-post.log is a file!
bin is a directory!
dev is a directory!
etc is a directory!
home is a directory!
lib is a directory!
lib64 is a directory!
media is a directory!
mnt is a directory!
opt is a directory!
proc is a directory!
root is a directory!
run is a directory!
sbin is a directory!
srv is a directory!
sys is a directory!
tmp is a directory!
usr is a directory!
var is a directory!

# csdn @ edu in / [11:43:15] 

 

我们使用 cd / 命令让根目录/变成当前目录,然后用引用符(Esc键下面的`) 将ls命令获取的根目录/内容作为循环变量用if语句进行判断处理:

用 -f判断是否为文件,如果是文件就输出文件名称并注明is a file

否则用 -d判断是否为目录 ,如果是目录就输出目录名称并注明is a directory

否则就输出文件名称并注明is other file

需要注意的是,我们用引用符(Esc键下面的`) 来引有ls命令获取的根目录/内容。

(二)列出当前目录下的.sh文件名并输出提示is a shell script file !

# csdn @ edu in ~ [14:03:58] 
$ ls *.sh  
zsh: no matches found: *.sh

# csdn @ edu in ~ [14:05:37] C:1
$ echo "hello" > hello.sh

# csdn @ edu in ~ [14:05:55] 
$ cat hello.sh
hello

# csdn @ edu in ~ [14:06:02] 
$ for f in $(ls *.sh);do echo $f is a shell script file \! ; done  
hello.sh is a shell script file !

# csdn @ edu in ~ [14:07:16] 

在上面的实例中,我们先用ls命令检查,发现当前目录下没有.sh文件

然后 我们用输出重定向创建了一个hello.sh

接着我们用for语句列出当前目录下的.sh文件名,并输出提示is a shell script file !

这里我们同样是引入了ls命令执行的结果,但引用的方法跟 (一)实例1:列出根目录/下的内容,判断其是文件还是目录并输出里不同,大家可以对比一下这两种方法 。

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

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

相关文章

什么是数字展览馆,数字展览馆有什么应用前景

引言&#xff1a; 数字展览馆作为一种新兴的文化艺术展示形式&#xff0c;以数字化技术和虚拟现实为基础&#xff0c;正在逐渐改变传统展览的方式。 一、什么是数字展览馆&#xff1f; 1.定义 数字展览馆是利用数字技术和虚拟现实技术打造的一种线上文化艺术展示平台。通过虚…

【网络协议】聊聊HTTPS协议

前面的文章&#xff0c;我们描述了网络是怎样进行传输数据包的&#xff0c;但是网络是不安全的&#xff0c;对于这种流量门户网站其实还好&#xff0c;对于支付类场景其实容易将数据泄漏&#xff0c;所以安全的方式是通过加密&#xff0c;加密方式主要是对称加密和非对称加密。…

git简单介绍,回车换行问题,倒计时+进度条小程序的实现+代码

目录 git--版本控制工具 介绍 使用 小程序 引入 回车换行问题 缓冲区问题 倒计时 分析 代码 进度条 分析 代码 git--版本控制工具 首先,我们需要下载git : yum install git 介绍 Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和目录的变化并协调多个人之…

常用 sqlite3 命令

本次将向您讲解 SQLite 编程人员所使用的简单却有用的命令。这些命令被称为 SQLite 的点命令&#xff0c;这些命令的不同之处在于它们不以分号 ; 结束。 让我们在命令提示符下键入一个简单的 sqlite3 命令&#xff0c;在 SQLite 命令提示符下&#xff0c;您可以使 用各种 …

新晋“断货王”!西圣Olite开放式耳机掀起抢购热潮,双十一首日售罄!

在双十一首日&#xff0c;西圣olite开放式耳机凭借其超高性价比&#xff0c;一举拿下“断货王”称号&#xff0c;在双十一首日已售罄&#xff0c;现在在各大电商平台均显示无货。 这一消息引起了社交媒体的热议&#xff0c;除了其超高性价比&#xff0c;性能可以媲美千元级别耳…

操作系统 day02(特征和发展历程)

一&#xff0c;操作系统的特征 并发和并行 共享 并发和共享互为存在条件 虚拟 异步 综上所述&#xff1a; 二&#xff0c;操作系统的发展历程

使用Ansible中的playbook

目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 2.YAML #简介# 是一种表达资料序列的格式,类似XML #特…

阿里云无影升级2.0 云电脑解决方案时代到来

10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云宣布无影全新升级2.0&#xff1a;从云电脑到云上解决方案&#xff0c;帮助中小企业更便捷地构建云上办公&#xff0c;并开放无影产品及解决方案能力&#xff0c;为生态合作伙伴提供企业云平台&#xff0c;帮助其打造定制化…

Mozilla Firefox 119 现已可供下载

Mozilla Firefox 119 开源网络浏览器现在可以下载了&#xff0c;是时候先看看它的新功能和改进了。 Firefox 119 改进了 Firefox View 功能&#xff0c;现在可以提供更多内容&#xff0c;如最近关闭的标签页和浏览历史&#xff0c;你可以按日期或网站排序&#xff0c;还支持查…

【设计模式】第24节:行为型模式之“模板方法模式”

一、简介 模板方法模式在一个方法中定义一个算法骨架&#xff0c;并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下&#xff0c;重新定义算法中的某些步骤。 模板模式有两大作用&#xff1a;复用和扩展。其中&#xff0c;复用指的是&#…

10.31日模拟赛总结

文章目录 考试时间及策略考试结果考试反思题解A.进步科学B.吉吉没急C.老杰克哒D.季积晓淆 考试时间及策略 没啥好说的&#xff0c;因为好像都不会。所以全场感觉都在罚坐&#xff0c;很痛苦。 考试结果 30 0 50 5 85 考试反思 T1&#xff1a;T1是个神奇状压&#xff0…

【java学习—十一】泛型(1)

文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型&#xff0c;JDK1.5新加入的&#xff0c;解决数据类型的安全性问题&#xff0c;其主要原理是在类声明时通过…

通过Google搜索广告传送的携带木马的PyCharm软件版本

导语 最近&#xff0c;一起新的恶意广告活动被发现&#xff0c;利用被入侵的网站通过Google搜索结果推广虚假版本的PyCharm软件。这个活动利用了动态搜索广告&#xff0c;将广告链接指向被黑客篡改的网页&#xff0c;用户点击链接后下载的并不是PyCharm软件&#xff0c;而是多种…

矢量图形编辑软件illustrator 2023 mac中文软件特点

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软…

leetcode:1446. 连续字符(python3解法)

难度&#xff1a;简单 给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s "leetcode" 输出&#xff1a;2 解释&#xff1a;子字符串 &q…

Spire.doc读取模板文档,并在书签处插入内容

在书签位置插入文字 //加载模板文档 Document document new Document(Server.MapPath("~/File/评价结果.doc")); //创建书签导航器 BookmarksNavigator bn new BookmarksNavigator(document); //添加一个section到文档 Section newSec document.AddSection(); …

Java设计模式之命令模式

目录 定义 结构 案例 优点 缺点 使用场景 JDK源码解析 Thread中start与run方法的区别 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增…

字体文件名称成中的Bold, Light,Italic,Regular, Medium是什么意思?

解释 字体文件名&#xff1a; IntelOneMono-Bold.ttf其中IntelOneMono字体名称 Bold 字体的样式 .ttf字体后缀 样式英文 中文Bold粗体BoldItalic粗体斜体Italic斜体Light细体LightItalic斜细体Medium中等MediumItalic中等斜体Regular标准以下来自鸿蒙字体以下来自鸿蒙字体TC…

大坝水库安全监测终端MCU,智能化管理的新篇章!

我国目前拥有超过9.8万座水库大坝&#xff0c;其中超过95%为土石坝&#xff0c;这些大坝主要是在上世纪80年代以前建造的。这些水库大坝在保障防洪、发电、供水、灌溉等方面发挥了巨大的作用&#xff0c;但是同时也存在一定的安全风险&#xff0c;比如坝体结构破损、坝基渗漏、…

基于 Center 的 3D 目标检测和跟踪

论文地址&#xff1a;https://arxiv.org/abs/2006.11275 论文代码&#xff1a;https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段&#xff0c;使用关键点检测器检测对象的中心&#xff0c;然后回归到其他属性&#xff0…