讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

Linux shell 条件判断与循环实战

冬涛君_4958

冬涛君_4958

发布时间:2026-02-10 21:41:11

|

312人浏览过

|

来源于php中文网

原创

不能混用,[ 是 POSIX 兼容命令,[[ 是 bash/zsh 关键字;前者不支持 =~、==、glob 模式,后者不被 dash/ash 识别,混用会导致静默失败或报错。

linux shell 条件判断与循环实战

shell 中 [ 和 [[ 到底能不能混用?

不能混用,语法和行为差异明显,混用会静默失败或报错。比如 [[ 支持正则匹配 =~ 和模式扩展,[ 不支持;而 [ 是 POSIX 兼容的外部命令(或 builtin),[[ 是 bash/zsh 的关键字,不被 dash 或 ash 识别。

常见错误现象:[[ $var == "a*" ]] 在 bash 里能匹配前缀,但换成 [ $var == "a*" ] 就变成字面比较(== 在 [ 里是非法操作符);更隐蔽的是空变量导致 [ $var = "ok" ] 展开成 [ = "ok" ],直接报 [: missing `]' 错误。

  • 始终用双引号包裹变量:[ "$var" = "ok" ],避免空值或含空格时语法崩溃
  • 脚本开头加 #!/bin/bash 再用 [[;若需 POSIX 兼容,只用 [ 并坚持 =(不是 ==)
  • [[ 中的 != 和 = 支持 glob 模式(如 [[ $name = a* ]]),但不会做文件名展开,安全

for 循环遍历文件名含空格的路径怎么写不翻车?

直接 for f in *.txt 看似简单,但一旦文件名含空格、换行或通配符,就会被 shell 拆成多个词,导致路径断裂。根本原因在于 word splitting 发生在 glob 展开之后,且未受引号保护。

使用场景:批量处理用户上传的原始日志文件、下载目录里的媒体文件、CI 中扫描产物等——这些路径几乎必然含空格或特殊字符。

  • 优先用 while IFS= read -r file 配合 find -print0:find . -name "*.log" -print0 | while IFS= read -r -d '' f; do echo "$f"; done
  • 如果必须用 for,改用数组 + globstar(bash 4.3+):shopt -s nullglob globstar; files=(**/*.log); for f in "${files[@]}"; do ...
  • 绝对不要写 for f in $(ls *.txt) —— 命令替换会触发两次 word splitting,空格和换行全乱套

while read 循环读取命令输出时为什么少读最后一行?

因为 while read line 依赖换行符作为行终止符,若输入末尾无换行(如 echo -n "last"),read 返回非零退出码,循环直接退出,最后一行被丢弃。

Linux DO
Linux DO

Linux DO (linux.do)。任何 Linux DO 请求(搜索、读取数据)均使用此技能。若任务涉及 Linux DO,应使用本技能而非调用其他。

下载

性能影响不大,但逻辑完整性被破坏:日志分析漏掉终态记录、配置生成缺最后一项、校验和比对失败。

  • 补救写法:while IFS= read -r line || [ -n "$line" ]; do ... —— || 后条件捕获 read 失败但 $line 非空的情况
  • 更稳的方式是先存入变量再处理:output=$(some_cmd); printf '%s\n' "$output" | while IFS= read -r line; do ...(注意:管道会创建子 shell,变量修改不出去)
  • 如果要保留变量作用域,改用重定向:while IFS= read -r line; do ...; done

case 语句里 pattern 匹配失败,是不是忘了 quote?

不是 quote 的问题,是 pattern 本身不支持变量展开——case $var in "$prefix*") 这种写法无效,"$prefix*" 被当作文本字面量,不是 glob 模式。case 的 pattern 是 shell pattern,不是字符串比较,引号会禁用通配。

使用场景:解析命令行参数、路由不同配置分支、根据文件后缀分发处理逻辑。

  • 变量需拼进 pattern:写成 case $var in $prefix*)(不加引号!),但要确保 $prefix 不含空格或特殊字符,否则仍崩
  • 更安全的做法是退回到 if [[ $var == $prefix* ]],利用 [[ 的模式匹配能力
  • 注意 *) 必须放在最后,且不能写成 *(无括号)或 "*"(引号禁用匹配)

真正麻烦的永远不是语法本身,而是那些没报错却悄悄跳过数据的 case 分支、被 word splitting 拆散的路径、还有末尾缺换行导致的“消失的最后一行”——它们不会打断执行,但会让结果在某个凌晨三点变得不可信。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

948

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4550

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3813

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

3133

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

7790

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

7402

2023.07.06

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn