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.mzph.cn/news/126798.shtml

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

相关文章

云原生---网络

ping ping是网络诊断工具&#xff0c;检测和特点主机地址之间的连通性 可以获得的关键信息&#xff1a; 01目标主机可达性 02RTT往返延迟 03丢包率 04TTL&#xff08;time to live&#xff09;数据包到主机经过的路由数量 05ping domain可以得到相应IP address 06ping不通七…

优先队列----数据结构

概念 不知道你玩过英雄联盟吗&#xff1f;英雄联盟里面的防御塔会攻击离自己最近的小兵&#xff0c;但是如果有炮车兵在塔内&#xff0c;防御塔会优先攻击炮车&#xff08;因为炮车的威胁性更大&#xff09;&#xff0c;只有没有兵线在塔内时&#xff0c;防御塔才会攻击英雄。…

css选择器,布局,BFC

一、选择器的优先关系 !important > 行内样式style > #id > .class > 标签div > 元素选择符 > *通用选择器 二、元素选择符有哪些 包含选择符:E F&#xff08;E所有的F包含子代&#xff0c;孙代&#xff0c;子子孙孙等等&#xff09;子选择符:E > F&am…

java多线程异步处理并获取处理后的返回值

示例部分代码&#xff1a; String param "hello"//举例用的线程池&#xff0c;一般建议自定义线程池ExecutorService executorService Executors.newFixedThreadPool(5);CompletionService<Object> completionService new ExecutorCompletionService<&g…

实在智能携手品牌商家,在活动会面中共谋发展

金秋十月&#xff0c;丰收的季节&#xff0c;也是商家们在双11大展拳脚的时刻。为迎战一年一度的双11大促&#xff0c;品牌商家在10月份卯足劲&#xff0c;制定一系列营销方案&#xff0c;争取为店铺带来更多流量和订单。 其中&#xff0c;舍得、同科医药、梅子熟了、宝洁、维…

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…

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

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

掌握 JavaScript 的基本语法

一、javascript书写位置 JavaScript 可以写在 HTML 页面中的以下三个位置&#xff1a; 内联脚本&#xff1a;将 JavaScript 代码直接写在 HTML 元素的 onclick、onload、onsubmit 等事件属性中。例如&#xff1a; <button onclick"alert(Hello World)">点击我…

【设计模式】第19节:行为型模式之“中介模式”

一、简介 中介模式定义了一个单独的&#xff08;中介&#xff09;对象&#xff0c;来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互&#xff0c;来避免对象之间的直接交互。 中介模式的设计思想跟中间层很像&#xff0c;通过引入中介这个中间层&#xf…

el-dialog中嵌套iframe之后拿不到iframe的id 的解决办法

在vueelement项目中想用到el-dialog弹窗加iframe嵌套外部页面的方法,但是这时候要获取iframe里面的ID 但是这时候怎么也获取不到 <el-dialog ref"middleFlag" v-if"middleFlag" width"1100px" height1200px title"文章管理" :visib…

2023年11月1日蜻蜓C影视追剧系统v1.2.2更新-与时俱进调整微信登录授权获取方式-修复无法登陆授权

2023年11月1日蜻蜓C影视追剧系统v1.2.2更新-与时俱进调整微信登录授权获取方式-修复无法登陆授权 问题背景&#xff1a; 小程序用户头像昵称获取规则调整公告官方 微信团队2022-05-09 更新时间&#xff1a;2022年11月9日 由于 PC/macOS 平台「头像昵称填写能力」存在兼容性问…

518抽奖软件,安全稳定,不怕手抖误按键

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 防误按功能 入口&#xff1a; 主界面上点右…

Unity Profiler 详细解析(二)

Profiler的主要参数详解 1. Memory Profiler Uesd Total : 当前帧的Unity内存&#xff0c;Mono内存&#xff0c;GfxDriver内存&#xff0c;Profiler内存以及额外内存的总和。 Reserved Total&#xff1a; 系统在当前帧申请的总体物理内存 Total System Memory Usage&#xff1…

opencv官网文档学习

1.图像处理基本使用 import cv2# 读取图像 image cv2.imread("images/1.png", cv2.IMREAD_GRAYSCALE) print("image:",image)# 显示图像 namedWindow cv2.namedWindow("images/1.png") cv2.imshow("images/1.png", image)# 等待按键…

MSQL系列(十一) Mysql实战-Inner Join算法底层原理及驱动表选择

Mysql实战-Inner Join算法驱动表选择 前面我们讲解了BTree的索引结构&#xff0c;及Mysql的存储引擎MyISAM和InnoDB,也详细讲解下 left Join的底层驱动表 选择, 并且初步了解 Inner join是Mysql 主动选择优化的驱动表&#xff0c;知道索引要建立在被驱动表上 那么对于Inner j…

Linux环境下运行selenium4.14

使用Python爬虫爬取数据时&#xff0c;需要用到selenium&#xff0c;在服务器上运行时&#xff0c;需要如下配置&#xff1a; 1、安装谷歌浏览器 yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -y 2、安装chromedriver 1&#xf…

MTSC2023|深圳大会,你关心的技术话题都在这里

MTSC中国互联网测试开发大会 (Make Tester Super Cool&#xff0c; 简称MTSC&#xff09; 是由国内知名的测试技术社区TesterHome发起的软件测试行业技术会议&#xff0c;大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流…

Android NDK开发详解之调试和性能分析的ndk-gdb

Android NDK开发详解之调试和性能分析的ndk-gdb 要求用法选项 NDK 包含一个名为 ndk-gdb 的 Shell 脚本&#xff0c;可以启动命令行原生调试会话。偏好使用 GUI 的用户则应阅读在 Android Studio 中调试这篇文档。 要求 要运行命令行原生调试&#xff0c;必须满足以下要求&am…

curl 断点续传

如何断点续传&#xff1a; curl “xxxxurl” -o RealisticPhotography_v10.safetensors 要实现断点续传&#xff0c;您可以使用curl工具并添加一些参数&#xff0c;以便在下载中断后恢复下载。下面是如何使用curl进行断点续传的方法&#xff1a; 首先&#xff0c;确保您已经安…

【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

请看vcr&#xff1a;https://transformers.run/back/transformer/