返回顶部
首页 > 资讯 > 精选 >怎么在Bash中使用循环
  • 528
分享到

怎么在Bash中使用循环

2023-06-16 02:06:56 528人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关怎么在Bash中使用循环,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。人们希望学习批处理命令的一个普遍原因是要得到批处理强大的功能。如果你希望批量的对文件执行一些指令,构造一个

这篇文章将为大家详细讲解有关怎么在Bash中使用循环,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

人们希望学习批处理命令的一个普遍原因是要得到批处理强大的功能。如果你希望批量的对文件执行一些指令,构造一个可以重复运行在那些文件上的命令就是一种方法。在编程术语中,这被称作执行控制for 循环就是其中最常见的一种。

for 循环可以详细描述你希望计算机对你指定的每个数据对象(比如说文件)所进行的操作。

一般的循环

使用循环的一个简单例子是对一组文件进行分析。这个循环可能没什么用,但是这是一个安全的证明自己有能力独立处理文件夹里每一个文件的方法。首先,创建一个文件夹然后拷贝一些文件(例如  JPEG、PNG 等类似的文件)至文件夹中生成一个测试环境。你可以通过文件管理器或者终端来完成创建文件夹和拷贝文件的操作:

$ mkdir example$ cp ~/Pictures/vacation/*.{png,jpg} example

切换到你刚创建的那个新文件夹,然后列出文件并确认这个测试环境是你需要的:

$ cd example$ ls -1cat.jpgdesign_maori.pnGotago.jpgwaterfall.png

在循环中逐一遍历文件的语法是:首先声明一个变量(例如使用 f 代表文件),然后定义一个你希望用变量循环的数据集。在这种情况下,使用 * 通配符来遍历当前文件夹下的所有文件(通配符 * 匹配所有文件)。然后使用一个分号(;)来结束这个语句。

$ for f in * ;

取决于你个人的喜好,你可以选择在这里按下回车键。在语法完成前,shell 是不会尝试执行这个循环的。

接下来,定义你想在每次循环中进行的操作。简单起见,使用 file 命令来得到 f 变量(使用 $ 告诉 shell 使用这个变量的值,无论这个变量现在存储着什么)所存储着的文件的各种信息:

do file $f ;

使用另一个分号结束这一行,然后关闭这个循环:

done

按下回车键启动 shell 对当前文件夹下所有东西的遍历。for 循环将会一个一个的将文件分配给变量 f 并且执行你的命令:

$ for f in * ; do> file $f ;> donecat.jpg: JPEG image data, EXIF standard 2.2design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlacedotago.jpg: JPEG image data, EXIF standard 2.2waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

你也可以用这种形式书写命令:

$ for f in *; do file $f; donecat.jpg: JPEG image data, EXIF standard 2.2design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlacedotago.jpg: JPEG image data, EXIF standard 2.2waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

对你的 shell 来说,多行和单行的格式没有什么区别,并且会输出完全一样的结果。

一个实用的例子

下面是一个循环在日常使用中的实用案例。假如你拥有一堆假期拍的照片想要发给你的朋友。但你的照片太大了,无法通过电子邮件发送,上传到图片分享服务也不方便。因此你想为你的照片创建小型的 WEB 版本,但是你不希望花费太多时间在一个一个的压缩图片体积上。

首先,在你的 linux、BSD 或者 Mac 上使用包管理器安装 ImageMagick 命令。例如,在 Fedora 和 RHEL 上:

$ sudo dnf install ImageMagick

ubuntu 和 Debian 上:

$ sudo apt install ImageMagick

在 BSD 上,使用 ports 或者 pkgsrc 安装。在 Mac 上,使用 Homebrew 或者 MacPorts 安装。

在你安装了 ImageMagick 之后,你就拥有一系列可以用来操作图片的新命令了。

为你将要创建的文件建立一个目标文件夹:

$ mkdir tmp

使用下面的循环可以将每张图片减小至原来大小的 33%。

$ for f in * ; do convert $f -scale 33% tmp/$f ; done

然后就可以在 tmp 文件夹中看到已经缩小了的照片了。

你可以在循环体中使用任意数量的命令,因此如果你需要对一批文件进行复杂的操作,可以将你的命令放在一个 for 循环的 dodone 语句之间。例如,假设你希望将所有处理过的图片拷贝至你的网站所托管的图片文件夹并且在本地系统移除这些文件:

$ for f in * ; do  convert $f -scale 33% tmp/$f  scp -i seth_web tmp/$f seth@example.com:~/public_html  trash tmp/$f ;done

你的计算机会对 for 循环中处理的每一个文件自动的执行 3 条命令。这意味着假如你仅仅处理 10 张图片,也会省下输入 30 条指令和更多的时间。

限制你的循环

一个循环常常不需要处理所有文件。在示例文件夹中,你可能需要处理的只是 JPEG 文件:

$ for f in *.jpg ; do convert $f -scale 33% tmp/$f ; done$ ls -m tmpcat.jpg, otago.jpg

或者,你希望重复特定次数的某个操作而不仅仅只处理文件。for 循环的变量的值是被你赋给它的(不管何种类型的)数据所决定的,所以你可以创建一个循环遍历数字而不只是文件:

$ for n in {0..4}; do echo $n ; done01234

更多循环

现在你了解的知识已经足够用来创建自己的循环体了。直到你对循环非常熟悉之前,尽可能的在需要处理的文件的副本上进行操作。使用内置的保护措施可以预防损坏自己的数据和制造不可复现的错误,例如偶然将一个文件夹下的所有文件重命名为同一个名字,就可能会导致他们的相互覆盖。

更进一步的 for 循环话题,请继续阅读。

不是所有的 shell 都是 Bash

关键字 for 是内置在 Bash shell 中的。许多类似的 shell 会使用和 Bash 同样的关键字和语法,但是也有某些 shell ,比如 tcsh,使用不同的关键字,例如 foreach

tcsh 的语法与 Bash 类似,但是它更为严格。例如在下面的例子中,不要在你的终端的第 2、3 行键入 foreach? 。它只是提示你仍处在构建循环的过程中。

$ foreach f (*)foreach? file $fforeach? endcat.jpg: JPEG image data, EXIF standard 2.2design_maori.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlacedotago.jpg: JPEG image data, EXIF standard 2.2waterfall.png: PNG image data, 4608 x 2592, 8-bit/color RGB, non-interlaced

在 tcsh 中,foreachend 都必须单独的在一行中出现。因此你不能像 Bash 或者其他类似的 shell 一样只使用一行命令创建一个 for 循环。

for 循环与 find 命令

理论上,你可能会用到不支持 for 循环的 shell,或者你只是更想使用其他命令的一些特性来完成和循环一样的工作。

使用 find 命令是另一个实现 for 循环功能的途径。这个命令提供了多种方法来定义循环中包含哪些文件的范围以及并行处理的选项。

find 命令顾名思义就是帮助你查询存储在硬盘里的文件。它的用法很简单:提供一个你希望它查询的位置的路径,接着 find 就会查询这个路径下面的所有文件和文件夹。

$ find .../cat.jpg./design_maori.png./otago.jpg./waterfall.png

你可以通过添加名称的某些部分来过滤搜索结果:

$ find . -name "*jpg"./cat.jpg./otago.jpg

find 命令非常好的地方在于你可以通过 -exec 参数标志将它查询到的每一个文件放入循环中。例如,只对存放在你的 example 文件夹下的 PNG 图片进行体积压缩操作:

$ find . -name "*png" -exec convert {} -scale 33% tmp/{} \;$ ls -m tmpdesign_maori.png, waterfall.png

-exec 短语中,括号 {} 表示的是 find 正在处理的条目(换句话说,每一个被找到的以 PNG 结尾的文件)。-exec 短语必须使用分号结尾,但是 Bash 中常常也会使用分号。为了解决这个二义性问题,你的 结束符 可以使用反斜杠加上一个分号(\;),使得 find 命令可以知道这个结束符是用来标识自己结束使用的。

find 命令的操作非常棒,某些情况下它甚至可以表现得更棒。比如说,在一个新的进程中使用同一条命令查找 PNG 文件,你可能就会得到一些错误信息:

$ find . -name "*png" -exec convert {} -flip -flop tmp/{} \;convert: unable to open image `tmp/./tmp/design_maori.png':No such file or directory @ error/blob.c/OpenBlob/2643....

看起来 find 不只是定位了当前文件夹(.)下的所有 PNG 文件,还包括已经处理并且存储到了 tmp 下的文件。在一些情况下,你可能希望 find 查询当前文件夹下再加上其子文件夹下的所有文件。find 命令是一个功能强大的递归工具,特别体现在处理一些文件结构复杂的情境下(比如用来放置存满了音乐人音乐专辑的文件夹),同时你也可以使用 -maxdepth 选项来限制最大的递归深度。

只在当前文件夹下查找 PNG 文件(不包括子文件夹):

$ find . -maxdepth 1 -name "*png"

上一条命令的最大深度再加 1 就可以查找和处理当前文件夹及下一级子文件夹下面的文件:

$ find . -maxdepth 2 -name "*png"

find 命令默认是查找每一级文件夹。

循环的乐趣与收益

你使用的循环越多,你就可以越多的省下时间和力气,并且可以应对庞大的任务。虽然你只是一个用户,但是通过使用循环,可以使你的计算机完成困难的任务。

你可以并且应该就像使用其他的命令一样使用循环。在你需要重复处理单个或多个文件时,尽可能的使用这个命令。无论如何,这也算是一项需要被严肃对待的编程活动,因此如果你需要在一些文件上完成复杂的任务,你应该多花点时间在规划自己的工作流上面。如果你可以在一份文件上完成你的工作,接下来将操作包装进  for  循环里就相对简单了,这里面唯一的“编程”的需要只是理解变量是如何工作的并且进行充分的规划工作将已处理过的文件和未处理过的文件分开。经过一段时间的练习,你就可以从一名  Linux 用户升级成一位知道如何使用循环的 Linux 用户,所以开始让计算机为你工作吧!

关于“怎么在Bash中使用循环”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在Bash中使用循环

本文链接: https://lsjlt.com/news/282129.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在Bash中使用循环
    这篇文章将为大家详细讲解有关怎么在Bash中使用循环,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。人们希望学习批处理命令的一个普遍原因是要得到批处理强大的功能。如果你希望批量的对文件执行一些指令,构造一个...
    99+
    2023-06-16
  • 怎么在Bash中编写循环
    本篇文章给大家分享的是有关怎么在Bash中编写循环,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用for循环和find命令自动对多个文件执行一组操作。人们想要学习Unix s...
    99+
    2023-06-28
  • 怎么在awk中使用循环
    本篇内容介绍了“怎么在awk中使用循环”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!awk 脚本有三个主要部分:BEGIN 和 END 函数...
    99+
    2023-06-16
  • bash编程中循环语句怎么用
    这篇文章将为大家详细讲解有关bash编程中循环语句怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。if 是单分支语句,使用格式如下: if condition ; then statement ….....
    99+
    2023-06-09
  • 怎么在Linux的bash中实现永远循环
    这篇文章主要介绍了怎么在Linux的bash中实现永远循环,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在 Linux 中有很多永远循环(或直到你决定停止)的方法,你可以在命...
    99+
    2023-06-15
  • 怎么在shell中使用for循环
    这篇文章将为大家详细讲解有关怎么在shell中使用for循环,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:#!/bin/shi=1SUM=`sed -n ...
    99+
    2023-06-09
  • 如何使用Bash的For循环
    这篇文章主要讲解了“如何使用Bash的For循环”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Bash的For循环”吧!用Bash Shell的for循环,每次递增数是500就行了。...
    99+
    2023-06-09
  • 怎么用Bash编程实现循环
    这篇文章主要介绍怎么用Bash编程实现循环,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!循环我使用过的所有编程语言都至少有两种循环结构来用来执行重复的操作。我经常使用 for 循环,然而我发现 while 和 unt...
    99+
    2023-06-16
  • 怎么在python中使用事件循环
    这篇文章将为大家详细讲解有关怎么在python中使用事件循环,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
  • 怎么在python中使用for…in循环
    这期内容当中小编将会给大家带来有关怎么在python中使用for…in循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python...
    99+
    2023-06-14
  • python中append怎么在for循环使用
    在Python中,可以通过使用append()方法将元素添加到列表中。在for循环中使用append()方法的一种常见方法是将循环变...
    99+
    2023-10-18
    python
  • 在 awk 中使用循环
    来学习一下多次执行同一条命令的不同类型的循环。 awk 脚本有三个主要部分:BEGIN 和 END 函数(都可选),用户自己写的每次要执行的函数。某种程度qzhTv上,awk 的主体部分就是一个循环,因为函数中的命令对每...
    99+
    2022-06-04
    awk循环 awk 使用循环
  • 怎么在while循环中使用sleep命令
    怎么在while循环中使用sleep命令?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 从1到10,每隔一秒打印一个数字#! /bin/bash #...
    99+
    2023-06-09
  • 怎么在bat脚本中使用for循环
    怎么在bat脚本中使用for循环?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Windows bat脚本的for语句基本形态如下:在cmd窗口中:for %I&nbs...
    99+
    2023-06-08
  • 怎么在python中使用while循环语句
    这期内容当中小编将会给大家带来有关怎么在python中使用while循环语句,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究...
    99+
    2023-06-14
  • foreach循环怎么在java8项目中使用
    这篇文章将为大家详细讲解有关foreach循环怎么在java8项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.首先遍历一个List方式1.一开始是这样的:public stati...
    99+
    2023-05-31
    java foreach循环 fo
  • MySQL中怎么使用WHILE循环模拟FOR循环
    在MySQL中,没有直接的FOR循环语句,但是可以使用WHILE循环来模拟一个FOR循环。可以使用一个变量来充当计数器,然后在WHI...
    99+
    2024-04-30
    MySQL
  • bash 编程中循环语句用法
    1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; then...
    99+
    2022-06-04
    语句 bash
  • C语言中for循环与while循环怎么使用
    本文小编为大家详细介绍“C语言中for循环与while循环怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中for循环与while循环怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、单层f...
    99+
    2023-07-02
  • Shell中while循环怎么使用
    本文小编为大家详细介绍“Shell中while循环怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Shell中while循环怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。while 循环是 She...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作