Bash While 循环:从基础知识到实际应用

2023-10-20

In Bash 脚本,while 循环用于在指定条件为 true 时执行语句块。基本语法是:


while [CONDITION]
do
  # Commands to be executed
done
  

只要 CONDITION 计算结果为 true,循环就会继续执行。当条件变为假时,循环终止,程序继续执行循环后面的下一条语句。

 

 

简单的 While 循环示例

让我们看一个 while 循环的基本示例:


count=1
while [ $count -le 5 ]
do
  echo "This is loop number $count"
  ((count++))
done
  

Output:


This is loop number 1
This is loop number 2
This is loop number 3
This is loop number 4
This is loop number 5
  

这里,一个变量count初始化为 1。只要 的值存在,循环就会继续执行count小于或等于5。

在循环内部,值count在每次迭代中增加 1,使用((count++)),一条消息将打印到屏幕上。

 

循环遍历文件

您可以使用 while 循环来迭代文件。

您可以处理目录中的所有文本文件来读取它们,如下所示:


find . -name "*.txt" | while read file
do
  echo "Processing $file"
  # You can add commands here to process each file
done
  

Output:


Processing ./file1.txt
Processing ./file2.txt
Processing ./directory/file3.txt
  

在此示例中,find命令列出所有.txt当前目录及其子目录中的文件。

The while循环读取每一行(文件路径)并为每个文件执行循环内的代码。

在这里,它打印一条消息,但您可以根据需要添加任何命令来处理每个文件。

 

将 test 命令与 While 循环结合使用

The 测试命令Bash 中用于检查文件类型和比较值。它通常在 while 循环中使用,以提供更复杂的条件检查。

您可以使用 test 命令检查文件大小:


file_size=$(stat -c%s "file.txt")
while [ $file_size -lt 1024 ]
do
  echo "File size is $file_size bytes. Waiting to reach 1KB..."
  sleep 1
  file_size=$(stat -c%s "file.txt")
done
  

Output:


File size is 100 bytes. Waiting to reach 1KB...
File size is 500 bytes. Waiting to reach 1KB...
...
  

在此示例中,您首先使用以下命令确定“file.txt”的文件大小stat -c%s。只要文件大小小于 1024 字节 (1KB),while 循环就会继续执行。

在循环内,会打印一条消息,然后脚本等待 1 秒,然后再次检查文件大小。

此循环将持续进行,直到文件大小达到或超过 1KB。

while 循环中的条件允许进行各种比较。以下是执行这些操作的方法。

数值比较


value=10
while [ $value -ne 0 ]
do
  echo "Value is $value"
  ((value--))
done
  

Output:


Value is 10
Value is 9
...
Value is 1
  

You use -ne只要该值不等于 0,就继续循环。每次迭代该值都会减 1。

字符串比较


name="John"
while [ "$name" != "Doe" ]
do
  echo "Name is $name"
  name="Doe" # You would update this from an external source
done
  

Output:


Name is John
  

You use !=比较字符串并继续循环,只要name不等于“Doe”。

循环内的文件测试


while [ ! -e "file.txt" ]
do
  echo "Waiting for file.txt to be created..."
  sleep 1
done
  

Output:


Waiting for file.txt to be created...
  

You use -e检查文件是否存在并继续循环直到“file.txt”存在。

 

退出循环

The break命令使您能够在条件变为 false 之前退出循环。


count=1
while [ $count -le 10 ]
do
  if [ $count -eq 5 ]; then
    break
  fi
  echo "Count: $count"
  ((count++))
done
  

Output:


Count: 1
Count: 2
Count: 3
Count: 4
  

在此代码片段中,循环通常会迭代直到count达到 10。但是,当count等于 5,则break命令被执行,提前终止循环。

 

跳到下一个迭代

The continue命令用于跳过循环的当前迭代并继续下一次迭代。


number=1
while [ $number -le 10 ]
do
  if [ $((number % 2)) -eq 0 ]; then
    ((number++))
    continue
  fi
  echo "Odd number: $number"
  ((number++))
done
  

Output:


Odd number: 1
Odd number: 3
Odd number: 5
Odd number: 7
Odd number: 9
  

在这里,循环迭代从 1 到 10 的数字,但是continue命令跳过偶数,导致循环仅打印奇数。

 

无限循环

可以使用以下语法创建无限循环:


while true
do
  echo "This will run forever."
done
  

可以通过实施退出策略来控制无限循环。


count=1
while true
do
  echo "Loop $count"
  ((count++))
  if [ $count -gt 5 ]; then
    break
  fi
done
  

Output:


Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
  

The while循环始终为真,但我们使用了break命令在计数达到 5 时退出 while 循环,从而防止实际的无限循环。

 

嵌套的 While 循环

嵌套 while 循环是另一个循环中的一个循环。以下是如何使用它们的示例:


i=1
while [ $i -le 10 ]
do
  j=1
  while [ $j -le 10 ]
  do
    echo -n "$((i * j)) "
    ((j++))
  done
  echo ""
  ((i++))
done
  

Output:


1 2 3 ... 10
2 4 6 ... 20
...
10 20 30 ... 100
  

此处,外循环迭代数字 1 到 10,内循环也迭代数字 1 到 10。

的乘法i and j被打印。

 

在 While 循环中使用输入

您可以使用 while 循环来处理来自文件或用户的输入。

从文件中读取行


while read line
do
  echo "Line: $line"
done < file.txt
  

Output:


Line: First line of file.txt
Line: Second line of file.txt
...
  

在这里,读命令从“file.txt”读取每一行,循环单独处理每一行。

读取用户输入


while true
do
  read -p "Enter 'exit' to quit: " input
  if [ "$input" == "exit" ]; then
    break
  fi
  echo "You entered: $input"
done
  

输出(取决于用户输入):


Enter 'exit' to quit: hello
You entered: hello
Enter 'exit' to quit: exit
  

这段代码读取用户输入,直到用户输入“exit”,它会调用break命令退出循环。

 

While 循环中的错误处理

使用未定义的变量或不正确的命令语法可能会导致错误。您应该考虑这些错误。


file="file.txt"
while read line
do
  # Processing code here
done < "$file" || echo "Error reading $file"
  

在这里,如果读取文件失败,则会打印一条错误消息。

调试技术(使用 set -x)

要跟踪脚本的执行,您可以使用set命令。


set -x
count=1
while [ $count -le 5 ]
do
  echo $count
  ((count++))
done
set +x
  

Output:


+ count=1
+ '[' 1 -le 5 ']'
+ echo 1
1
+ (( count++ ))
+ '[' 2 -le 5 ']'
+ echo 2
2
...
  

The set -x命令在执行之前打印每个命令及其扩展参数,提供循环内发生的情况的详细跟踪。

 

实际应用

While 循环在现实世界的自动化和监控任务应用程序中至关重要。

监控系统资源


while true
do
  free -m | awk '/^Mem:/ {print "Free memory: " $4 " MB"}'
  sleep 5
done
  

此示例每 5 秒打印一次可用内存,利用free and awk命令。

自动化重复性任务


files="/path/to/files/*.txt"
while read file
do
  gzip "$file"
done <<< "$(ls $files)"
  

在这里,循环使用以下命令压缩目录中的所有文本文件gzip命令.
这些示例说明了 while 循环在系统监控和任务自动化中的一些应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash While 循环:从基础知识到实际应用 的相关文章

  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • 确保 config.h 包含一次

    我有一个库项目 正在使用 Linux 中的 autotools 套件移植到该项目 我对自动工具很陌生 本周 我已经了解了其操作的基础知识 我有一个关于如何保留内容的问题config h免遭重新定义 我惊讶地发现生成的config h文件也没
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐

  • 如何在 CentOS/RHEL 7 上安装 NVM

    NVM代表 Node Version Manager 是一个用于管理 Node 版本的命令行实用程序 有时您需要部署具有不同 2 个版本的多个节点应用程序 管理不同 2 项目的多个 Node js 版本对于开发人员来说是一件痛苦的事情 但
  • 如何在 Fedora 29-25、CentOS 7/6 上安装 VirtualBox 来宾添加

    The 虚拟盒子Guest Additions 提供了一些设备驱动程序和应用程序 用于优化来宾操作系统的性能和可用性 它安装在来宾操作系统内 因此 您需要在系统上运行的每个虚拟机上安装 我建议安装或升级 VirtualBox最新版本优先 本
  • 如何在 Bash 中转义单引号

    Bash 脚本对于开发人员 系统管理员以及任何需要在 Unix 或 Linux 系统上自动执行任务的人来说是一项至关重要的技能 有时 您需要在 bash 脚本的字符串中使用单引号 但是 由于 bash 解释单引号的方式 如果处理不当 可能会
  • 如何在 Ubuntu 18.04 和 16.04 上安装 ownCloud 10

    ownCloud使用 Web 界面提供数据访问 它还提供跨设备同步和共享的选项 一切都在您的控制之下 使用 ownCloud 我们可以轻松地对每个用户的文件 ACL 实施限制 ownCloud 提供桌面客户端 Windows MAC Lin
  • 如何使用预准备语句防止 PHP 中的 SQL 注入

    SQL 注入是一种常见的攻击形式 针对使用 SQL 数据库的 Web 应用程序 在此类攻击中 攻击者利用应用程序代码中的漏洞注入恶意 SQL 语句 这些语句可能会危害数据库并可能泄露敏感信息 PHP 是一种流行的 Web 开发语言 通常与
  • 了解 Python 中的区分大小写

    Python 是使用最广泛的编程语言之一 以其简单性和可读性而闻名 然而 与许多语言一样 它具有新手和经验丰富的程序员都应该理解的独特特征 其中一项特征是区分大小写 在本指南中 我们将深入了解 Python 中的大小写敏感性及其重要性 什么
  • 如何设置 SFTP Chroot Jail

    如果您是管理 Linux 服务器的系统管理员 您可能需要向某些用户授予 SFTP 访问权限 以将文件上传到他们的主目录 默认情况下 可以通过SSH SFTP等方式登录系统的用户SCP可以浏览整个文件系统 包括其他用户的目录 如果这些用户是可
  • 如何在 Linux 中终止进程

    您是否遇到过这样的情况 您启动了一个应用程序 但在使用该应用程序时突然变得无响应并意外崩溃 您尝试再次启动应用程序 但没有任何反应 因为原始应用程序进程从未真正完全关闭 好吧 我们所有人都曾在某个时刻发生过这种事 不是吗 解决方案是终止或终
  • 如何在 CentOS 7 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 专为客户端和服务器之间的安全连接而设计 两种最流行的 SSH 身份验证机制是基于密码的身份验证和基于公钥的身份验证 使用 SSH 密钥通常比传统的密码身份验证更安全 更方便 本教程介绍如
  • 如何重命名本地和远程 Git 分支

    您正在与一群人合作开发一个项目 并且您已经为 git 分支定义了命名约定 你创建了一个新分支 将更改推送到远程存储库 并意识到您的分支名称不正确 幸运的是 Git 允许您使用以下命令轻松地重命名分支 git branch m命令 本指南介绍
  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引
  • Bash While 循环:从基础知识到实际应用

    In Bash 脚本 while 循环用于在指定条件为 true 时执行语句块 基本语法是 while CONDITION do Commands to be executed done 只要 CONDITION 计算结果为 true 循环