devops-exercises 实战:用 Bash `while read` 循环与 `wc -c` 实现逐行字符计数
文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载本文以 devops-exercises 仓库中 Count Chars 练习及其官方解法为主线系统讲解 Bash 交互式输入、while循环读取与wc字符计数的完整套路。读完本文你将能够独立编写一个持续读取用户输入、逐行统计字符数、遇到空行自动退出的 Bash 脚本并理解read、echo -n、wc -c等关键命令的底层行为与常见坑点。练习背景这道题在考什么在 topics/shell/README.md 的 Shell Scripting 练习表中Count Chars 被明确归类为Input While Loops输入 While 循环难度标注为 Basic基础。它紧跟在Files SizeFor 循环之后、Sum函数之前是仓库刻意设计的循环控制结构进阶练习前一道题教你用for遍历列表这道题则要求你改用while持续消费交互式输入流。原始练习文档 count_chars.md 给出的目标是从用户处读取输入直到得到空字符串为止对于读到的每一行统计字符数量并打印出来。约束条件只有两条必须使用 while 循环且假设至少有 3 行输入。也就是说这道题刻意禁止你用for、xargs、awk等旁路方案强制你掌握while read这一经典模式。官方解法逐行拆解仓库给出的标准答案位于 solutions/count_chars.md完整代码如下#!/usr/bin/env bash echo -n Please insert your input: while read line; do echo -n $line | wc -c echo -n Please insert your input: done这段脚本虽短却串联起了四个 Bash 核心知识点我们逐一展开。1. Shebang#!/usr/bin/env bash首行#!/usr/bin/env bash是 shebang 行。与直接写#!/bin/bash不同env方式会去PATH环境变量中查找bash的绝对路径因此在 bash 安装位置不固定的系统上更具可移植性。仓库的 Shell 自学评估章节见 topics/shell/README.md也专门解释了 shebang 的含义/bin/bash是 Linux 用户登录时最常见的默认 shellBourne-again shell 功能更全、语法更完善因此被广泛采用。保存为count_chars.sh后可通过以下方式运行bash count_chars.sh # 方式一显式指定解释器 chmod x count_chars.sh ./count_chars.sh # 方式二赋予执行权限后直接运行shebang 生效2.echo -n不换行输出提示符echo -n表示输出后不追加换行符。脚本用它打印Please insert your input: 让光标停留在提示符末尾用户输入与提示符处于同一行交互体验更自然。这一处细节也是后面统计结果正确的关键前提原因见第 4 节。3.while read line循环读取输入直到空串read是 Bash 内建命令作用是从标准输入或指定文件描述符读取一行并存入变量。仓库 README 的自学评估部分对此有精辟概括Using the keywordreadso for exampleread xwill wait for user input and will store it in the variable x用read x等待用户输入并存入变量 x。while read line; do ... done的完整语义是每次循环迭代开始时read line阻塞等待一行输入读到的内容存入变量line当读到空串直接回车或到达 EOF如 CtrlD时read返回非零退出码循环条件不成立while自动终止。这正是练习目标 1Read input from the user until you get empty string的实现机制无需显式break或判断语句read的退出状态本身就是天然的循环结束条件。脚本在循环体末尾再次echo -n打印提示符形成提示 → 输入 → 统计 → 再提示的循环下一轮read继续等待。若想一次性输入多行后批量处理例如输入以文件或管道方式重定向while read line同样适用此时循环会逐行消费标准输入直到 EOF。4.wc -c为什么能数对字符数wcword count的-c选项统计字节数。管道echo -n $line | wc -c的执行链条是echo -n $line输出变量内容不加换行管道|把该输出接到wc -c的标准输入wc -c统计收到的字节数并打印。这里有两个极易踩坑的细节echo必须加-n。echo默认会在末尾追加换行符\n1 个字节若写成echo $line | wc -c统计结果会比实际字符数多 1。解法用echo -n正是为了剔除这个隐形多出的换行字节。-c统计的是字节而非字符。对纯 ASCII 输入字母、数字、标点而言字节数等于字符数但如果输入包含 UTF-8 多字节字符如中文中占 3 字节、emoji 占 4 字节wc -c报出的数字会大于实际字符数。需要按字符数统计时应改用wc -m或使用 Bash 的字符串长度语法${#line}。练习文档假定的是常规英文交互输入因此wc -c是合理且最直接的答案。5. 约束条件如何被满足必须使用 while 循环解法正体就是while read line; do ... done无for、until或其他循环结构假设至少有 3 行输入保证脚本能至少展示 3 轮完整的提示—统计迭代便于人工验证循环确实在持续工作。一次完整的运行演示假设脚本已保存为count_chars.sh典型交互过程如下hello、world、空行依次输入末尾CtrlD或直接回车结束$ bash count_chars.sh Please insert your input: hello 5 Please insert your input: world 5 Please insert your input: 0 Please insert your input:hello为 5 个字符wc -c输出5world同为 5 个字符输出5直接回车输入空串echo -n 输出 0 字节wc -c输出0随后read读到空串返回非零状态循环结束。注意最后一次提示符之后程序便退出这正是目标 1读到空字符串即停止的直接体现。纵向扩展边界情况、健壮性与常见改进空白行与多字节字符输入为空格串如 时read默认按IFS内部字段分隔符拆分可能把行内容吃掉严格场景可改用while IFS read -r line-r防止反斜杠转义IFS避免首尾空白被剥离。需要按字符统计时wc -m或${#line}是更好的选择尤其是涉及中文、日文等 UTF-8 内容时。管道子 shell 陷阱while read若出现在管道右侧如cat file | while read line; do ...; done循环体会在子 shell 中执行循环内部对变量的修改在循环结束后不会保留到父 shell。本练习直接读取终端输入、不涉及管道因此不存在此问题但编写批量文件处理脚本时务必留意这一 Bash 经典坑点。交互式输入的退出方式除输入空行外用户也可用CtrlD发送 EOF 信号结束循环。两种方式都依赖read返回非零状态这一统一机制脚本无需额外处理。结合仓库证据解法与练习文档的对应关系知识点仓库依据练习定位Input While Loopstopics/shell/README.md 练习表中的 Count Chars 行练习原始目标与约束topics/shell/count_chars.md标准解法topics/shell/solutions/count_chars.mdread关键字用法说明topics/shell/README.md 自学评估如何获取用户输入条目shebang 语义topics/shell/README.md 自学评估第一条循环练习题组Files SizeFor 循环、Sum函数从源码结构可以推断仓库将 Shell 练习按难度递进编排Hello World变量→Basic date变量→Argument Check条件判断→Files SizeFor 循环→Count Chars输入 While 循环→Sum函数。count_chars.md正处于从循环结构过渡到函数封装的衔接位置是掌握交互式脚本的基础必修课。小结Count Chars 表面上是统计字符的小练习实际覆盖了 Bash 脚本四大基础能力shebang 与执行方式、read的交互式输入语义、while循环借助退出码实现读到空即停、以及wc -c/echo -n配合管道做精确字节统计。理解这四点的组合逻辑后你可以轻松把它改造为更通用的逐行处理工具——例如把wc -c换成wc -w统计单词数、把提示词换成自定义参数、或把输入源从键盘换成文件重定向从而应对各类交互式或批量文本处理需求。赞分享文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载相关推荐devops-exercises 实战用 Bash while 循环逐行读取用户输入并统计字符数Count Charsdevops exercises 实战用 Bash while 循环逐行读取用户输入并统计字符数Count Chars 导读 本文围绕 devops ex文档教程DevOps运维bash循环读取文件while read line结构bash循环读取文件while read line结构 你是否还在为处理日志文件、配置解析或数据清洗时的逐行读取需求而烦恼本文将系统讲解 while rea教程devops-exercises 实战用 Python 实现字符串压缩与解压Run-Length Encodingdevops exercises 实战用 Python 实现字符串压缩与解压Run Length Encoding 本篇技术指南围绕 devops exe文档教程DevOps运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →