shell 循环命令详解


☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

目录
    1. for 命令
  • 1.1 for 命令的使用方法

  • 1.2 for 命令可能遇到的难题

  • 1.3 修改字段分隔符

  • 1.4 使用通配符读取目录

    1. C 风格的 for 命令
    1. while 命令
    1. until 命令
    1. 控制循环
  • 5.1. break 命令的使用

  • 5.2. continue命令的应用

  1. for 命令

1.1 for 命令的使用方法

在 bash shell 中,for 命令允许创建一个循环来遍历一系列值。每轮循环都使用列表中的一个值执行预定义的命令集。以下是 bash shell 中 for 命令的基本语法:

for var in list
do
    commands
done

或者可以这样写 for var in list; do

这里的 list 不是 shell 的关键字,它代表数值、字符或字符串组成的列表,for 循环将遍历这个列表。

使用示例:

for i in a b c d e f
do
echo "当前字符是:$i"
done

当前字符是:a 当前字符是:b 当前字符是:c 当前字符是:d 当前字符是:e 当前字符是:f

for name in Alabama Alaska Arizona Arkansas California Colorado
do
echo 下一个州是 $name
done

下一个州是 Alabama 下一个州是 Alaska 下一个州是 Arizona 下一个州是 Arkansas 下一个州是 California 下一个州是 Colorado

也可以从变量中加载值:

在 shell 脚本中,常见的情况是将一系列值存储在一个变量中,然后需要遍历这个变量中的列表。

str="hello, word"

for s in $str do echo "$s" done

还可以从命令中加载值:

通过命令替换,可以执行任何产生输出的命令,并在 for 命令中使用该命令的输出。

file="file_name"

for f in $(cat $file) do echo "$f" done

1.2 for 命令可能遇到的难题

for 循环可以遍历字符串列表,比如 Alabama Alaska Arizona Arkansas California Colorado,但如果字符串中包含特殊字符,如 this'll,就会遇到问题,因为这些字符在 shell 中有特殊含义。解决方法是使用反斜杠 \ 转义特殊字符,例如 this\'ll,或者将字符串用双引号括起来,例如 "this'll"

例如:

for s in I don\'t know if "this'll" work
do
echo "单词:$s"
done

1.3 修改字段分隔符

为什么需要修改字段分隔符呢?如果你需要输出一个英文文章,文章内容自然包含单词间的空格和行与行之间的换行符。如果 shell 输出内容的字段分隔符是空格,那么输出内容时可能会变成一列,而不是一行一行的输出。这是因为特殊的环境变量 IFS(内部字段分隔符)。IFS 定义了 bash shell 用作字段分隔符的字符。默认情况下,bash shell 将以下字符视为字段分隔符:

  • 空格
  • 制表符
  • 换行符
    如果 bash shell 在数据中看到这些字符中的任何一个,它就会认为这标志着列表中一个新数据字段的开始。

要解决这个问题,可以在 shell 脚本中临时更改 IFS 环境变量的值,以限制 bash shell 视为字段分隔符的字符,例如 IFS=$'\n',这样字段分隔符就变为换行了。这样 bash shell 会认为换行才是数据的结束,忽略空格和制表符。

如下所示存储旧值并赋予临时修改值:

file="file_name"

IFS_OLD=$IFS IFS=$'\n'

for f in $(cat $file) do echo "$f" done

IFS=$IFS_OLD

1.4 使用通配符读取目录

可以使用 for 命令自动遍历目录中的文件。在执行此操作时,必须在文件名或路径名中使用通配符。这会强制 shell 使用文件扩展匹配。文件扩展匹配是生成匹配指定通配符的文件名或路径名的过程。在不知道所有文件名的情况下,这个特性在处理目录中的文件时非常有用。

从目录中加载所有文件和文件夹:

for file in /home/rich/test/*
do
if [ -d "$file" ]
then
echo "$file 是目录"
elif [ -f "$file" ]
then
echo "$file 是文件"
fi
done
  1. C 风格的 for 命令

我们先来看看 C 语言代码中 for 循环的代码风格:

for (i = 0; i 

以下是 bash shell 中 C 语言风格的 for 循环的基本格式:

for (( variable assignment ; condition ; iteration process ))
↓↓↓
for (( a = 1; a 

C语言风格的 for 循环格式可能会让 bash shell 脚本程序员感到困惑,因为它使用了 C 语言风格的变量引用方式,而不是 shell 风格的变量引用方式。
需要注意的是,有些部分并不遵循 bash shell 标准的 for 命令:
变量赋值可以有空格
条件中的变量不以美元符开头
迭代过程的算式未用 expr 命令格式

使用 C 风格的 for 命令可以像 C 语言那样使用多个变量,例如:

for (( a=1, b=10; a 
  1. while 命令

while 命令的关键在于所指定的 test command 的退出状态码必须随着循环中运行的命令而改变。如果退出状态码不发生变化,while 循环将一直不停地进行下去。最常见的 test command 的用法是用方括号来检查循环命令中用到的 shell 变量的值。

while test command
do
other commands
done

实例:

while [ $a -gt 0 ]
do
echo $a
a=$[ $a - 1 ]
done

while 还可以使用多个测试命令

while 命令允许你在 while 语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。

while echo $a
[ $a -ge 0 ]
do
echo "这是在循环内部"
a=$[ $a - 1 ]
done
  1. until 命令

until 命令和 while 命令的工作方式完全相反。until 命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为 0,bash shell 才会执行循环中列出的命令。一旦测试命令返回了退出状态码 0,循环就结束了。

until test command
do
other commands
done

实例:

until [ $a -eq 0 ]
do
echo $a
a=$[ $a - 25 ]
done
  1. 控制循环

在脚本中执行循环的过程中,有时我们需要根据特定的条件及时退出循环去执行其他任务。因此,我们需要能够对循环进行条件上的控制。shell 中的 break 命令和 continue 命令可以帮助我们控制循环内部的情况。

5.1. break 命令的使用

break 命令是一种退出循环的简单方法。可以使用 break 命令来退出任意类型的循环,包括 while 和 until 循环。

在 shell 执行 break 命令时,它会尝试跳出当前正在执行的循环。
有时你在内部循环,但需要停止外部循环。break 命令接受一个命令行参数值,break n,其中 n 指定了要跳出的循环层级。默认情况下,n 为 1,表明跳出的是当前的循环。如果你将 n 设为 2,break 命令就会停止下一级的外部循环。

5.2. continue命令的应用

continue 命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。例如,提前终止本次循环,进入下一次循环(当 shell 执行 continue 命令时,它会跳过 while 循环中余下的命令)。

至此,本文关于 shell 循环命令的详细介绍就到这里了。更多相关的 shell 循环命令内容,请搜索我们之前的文章或继续浏览下面的相关文章,希望大家以后多多支持我们!


# this  # 可以使用  # 加载  # 情况下  # 你在  # 还可以  # 的是  # 多个  # 就会  # 遍历  # 分隔符  # c语言  # 循环  # 命令行参数  # 字符串  # continue  # break  # while  # for  # bash  # 为什么  # 解决方法 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: Canva AI终极指南:免费AI聊天机器人,设计、视频、网站全搞定!  解密Poppy Playtime怪物:全面解析玩具世界背后的故事  PixianAI抠图怎么修复瑕疵_PixianAI瑕疵修复与手动涂抹工具【步骤】  AI语音生成指南:免费工具、变现实战与避坑策略  AI驱动的自动化工作流:Zapier、Perplexity和Claude集成指南  AI语音生成器终极指南:免费工具与逼真语音编辑  在线歌曲歌词生成器:创意歌词轻松创作指南  AI症状自检:最佳AI症状检查器,告别网络庸医!  提升英语口语:地道表达周末体验,语法精讲助你流利交流  Replika AI:情感慰藉还是虚拟危机?深度剖析与用户反馈  Django与React构建AI音乐推荐:数据库集成实战指南  消除噪音,提升音质:Audo.ai终极指南  AI无镜头相机Paragraphica:颠覆传统摄影的新方式  利用 DeepSeek 进行大规模 C++ 代码库审计  GTA Online: 2025最新无限隐形套装防消失技巧  AI末日预言?智能聊天机器人真的能替代信仰吗?  暖心“小艺通话”:让语障人士告别沟通困境,拥抱平等生活  斑马AI怎样设置专注模式_斑马AI专注时段与干扰屏蔽【指南】  教你用AI一键生成Excel VBA脚本,彻底告别重复操作  AI 播客脚本写作工具:提升内容创作效率的终极指南  百度输入法ai模式怎么关 百度输入法恢复普通模式  GitHub Copilot终极指南:提升代码效率与质量  Higgsfield WAN 2.5:AI视频生成工具新纪元  tofai官网入口网站 tofai官网入口网页版  Gemini怎样写描述型提示词_Gemini描述提示词编写【攻略】  AI一键生成儿童绘本故事  利用AI模板高效创建产品需求文档 (PRD)  ChatGPT一键生成PPT怎么加内容_ChatGPTPPT内容添加【方法】  Voice AI:下一代AI语音助手,重塑人机交互  使用AI配乐:ElevenLabs Music音乐生成器终极指南  Google NotebookLM:AI赋能的智能笔记与思维导图工具  百度AI搜索能否查实时新闻_百度AI搜索新闻频道与更新频率【方法】  Zapier MCP:AI赋能工作流,释放Claude强大潜能  钉钉ai划词工具怎样查看划词历史_钉钉ai划词工具历史记录查询【指南】  7个简单高效的面部肌肉锻炼,改善面部不对称,塑造完美脸型  夸克AI能否查快递物流_夸克AI快递查询入口与单号输入【步骤】  百度AI助手网页版入口 免安装直接打开入口  极氪回应明年车辆质保权益等问题:部分政策有调整  Midjourney怎样加风格词调质感_Midjourney风格词技巧【指南】  京东旅行AI能否抢返程票_京东AI返程票预约与自动抢购【技巧】  怎么用AI帮你写一份有说服力的加薪申请?  老电脑焕新:i5-2400搭配FirePro V5900 打造复古游戏利器  Fiverr网站审计终极指南:免费工具、SEO技巧和实战案例  稿定设计AI抠图怎样处理复杂边缘_稿定设计AI复杂边缘细化技巧【技巧】  自动化AI汽车生成挑战赛1966 Gasmea回顾与评分  AI学习秘籍:3个高效黑科技,解锁智能学习新时代  DeepSeek写合同怎么用_DeepSeek写合同使用方法详细指南【教程】  兔展AI排版如何批量生成多尺寸图_兔展AI排版多尺寸批量生成步骤【实操】  EdrawMax AI:项目管理和创意专业人士的终极图表工具  Logic Pro 11更新全面解析:免费升级、AI功能与音乐制作流程 

 2025-04-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.