我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Introduction to Bash Scripting 教程:用 read 命令实现 Bash 用户输入交互

Introduction to Bash Scripting 教程:用 read 命令实现 Bash 用户输入交互 Introduction to Bash Scripting 教程用 read 命令实现 Bash 用户输入交互【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting本篇技术指南聚焦于开源电子书《Introduction to Bash Scripting》中德文版 005-bash-nutzer-eingaben.md 所讲解的核心主题——如何在 Bash 脚本中通过read命令读取用户输入。你将掌握从echoread的基础写法到read -p的简写技巧、read的高级选项隐藏输入、超时、数组读取等并看到这些技巧在本仓库交互式菜单示例中的真实应用。读完本文你能写出带提示、带校验的交互式 Bash 脚本并了解如何借助仓库自带的 shellcheck-ebook.sh 校验脚本中的代码片段。从变量到用户输入脚本的第一次对话在 Bash 脚本中变量通常由脚本内部赋值如nameDevDojo参见 004-bash-variablen.md。但真正的实用脚本需要与用户对话让用户输入数据脚本再基于这些数据做出响应。这正是本章的主题。先回顾脚本骨架任何 Bash 脚本文件的第一行都需要指定 shebang#!/bin/bash它告诉操作系统用/bin/bash来执行该脚本详见 002-bash-struktur.md#!/bin/bash基础写法echo 提示 read 读取打开devdojo.sh文件可用nano devdojo.sh编辑将脚本更新为以下内容#!/bin/bash echo Wie lautet Ihr Name? read name echo Hallo, $name echo Willkommen bei DevDojo!这里发生了什么echo Wie lautet Ihr Name?先向屏幕输出一行提示文字告诉用户接下来要输入什么read nameread命令暂停脚本执行等待用户从键盘输入一行文本并把输入的内容以字符串形式存入变量name后面的两条echo语句通过$name引用该变量把个性化消息回显给用户。注意一个常见陷阱德文原版文档的笔误Bash 的变量名是区分大小写的。read name存入的是name如果后续误写成echo Hallo, $Name由于不存在名为Name的变量输出会变成Hallo,空值。因此请始终保持变量名大小写一致这是新手最容易踩的坑。运行与完整输出流程保存文件后先执行脚本./devdojo.sh脚本运行后终端会依次呈现以下交互Wie lautet Ihr Name?此时脚本正在等待输入输入你的名字例如Bobby并按下回车Wie lautet Ihr Name? Bobby回车后脚本继续执行输出结果Hallo, Bobby Willkommen bei DevDojo!整个流程体现了交互式脚本的基本模型输出提示 → 阻塞等待 → 读取输入 → 变量引用 → 输出响应。变量引用的规范始终加双引号在引用用户输入的变量时请养成加双引号的习惯。原文档使用echo $name而德文版 004 章节使用的是未加引号的echo $name。正确的做法是始终用双引号包裹变量$name因为不加引号时Bash 会对变量的值进行词拆分word splitting和通配符展开globbing导致不可预期的行为甚至安全隐患。举例说明来自 004-bash-variables.md#!/bin/bash filenamemy file.txt # 错误 - Bash 会把值拆成两个词 my 和 file.txt touch $filename # 实际创建了两个文件my 和 file.txt # 正确 - 双引号把整个值作为一个参数 touch $filename # 只创建一个文件my file.txt如果用户输入包含空格、通配符*、?或其他特殊字符不加引号时 Bash 会去解释它们而不是把它们当作普通字符串。经验法则变量引用一律使用$name而非$name。当变量名后紧跟其他字符可能造成歧义时还应使用花括号形式${name}。精简写法read -p 一行完成提示 读取原文档指出为了减少代码行数可以用read的-pprompt选项它会在等待输入前先打印一条提示消息从而省去单独的echo语句#!/bin/bash read -p Wie ist Ihr Name? name echo Hallo, $name echo Willkommen bei DevDojo!执行效果与第一种写法完全一致终端先显示Wie ist Ihr Name?等待输入回车后输出问候语。注意提示字符串末尾的空格它让用户的输入与提示文字之间留出一个空格观感更自然。read -p是交互式脚本中最常用的写法本仓库 016-creating-an-interactive-menu-in-bash.md 中的菜单脚本正是用read a读取用户选择的选项编号。深入 read常用选项与进阶用法read是 Bash 内建命令除了-p之外还有一批高频选项能让交互体验更专业选项作用示例-p 提示读取前输出提示消息read -p 输入密码: pass-s静默模式不回显输入适合密码read -s -p 密码: pass-n N读取 N 个字符后立即返回无需回车read -n 1 -p 继续? [y/n] ans-t 秒设置超时时间超时后返回非零状态read -t 5 -p 5秒内确认: ans-a 数组把输入按空格拆分成数组元素read -a fruits-r禁止反斜杠转义保留原始输入read -r line组合使用示例——带超时的密码输入#!/bin/bash if read -t 5 -s -p 请输入密码5秒内: password; then echo echo 已收到密码长度 ${#password} 个字符 else echo echo 输入超时脚本退出 exit 1 fi这里用到了两个值得注意的点read的退出状态用户成功输入读到 EOF 前的数据时返回 0超时或按下CtrlD时返回非零因此可以直接放在if条件中判断${#password}变量长度扩展语法统计用户输入的长度。不给变量名会怎样REPLY 变量当read后不指定任何变量名时输入会被存入特殊变量REPLY#!/bin/bash read -p 你的名字: echo 你好, $REPLY这在只想快速读取一行且无需持久化命名时非常方便。实战结合用 read 构建交互式菜单用户输入最典型的实战场景就是菜单程序。本仓库的 交互式菜单章节 给出了完整示例脚本先输出带颜色的菜单选项然后用read读取用户选择再通过case分支调用对应函数。核心交互部分如下menu(){ echo -ne My First Menu $(ColorGreen 1)) Memory usage $(ColorGreen 2)) CPU load $(ColorGreen 3)) Number of TCP connections $(ColorGreen 4)) Kernel version $(ColorGreen 5)) Check All $(ColorGreen 0)) Exit $(ColorBlue Choose an option:) read a case $a in 1) memory_check ; menu ;; 2) cpu_check ; menu ;; 3) tcp_check ; menu ;; 4) kernel_check ; menu ;; 5) all_checks ; menu ;; 0) exit 0 ;; *) echo -e ${red}Wrong option.${clear}; menu ;; esac }可以看到read在本仓库真实脚本中的三种角色读取选择read a把用户输入的数字存入变量a驱动分支case $a in ...根据$a的值分发到不同函数循环回显每个分支执行完函数后再次调用menu实现菜单循环输入非法值*分支时提示错误并重新显示菜单。这段代码是read从读取一行升级为驱动交互流程的最佳范例也印证了本章知识点在后续章节中的复用价值。代码质量保障仓库如何校验这些代码块这个开源仓库不只是写了就算还通过 scripts/shellcheck-ebook.sh 对英文版各章节 Markdown 中的全部 bash 代码块做自动化静态检查。脚本的核心逻辑逐行扫描ebook/en/content/*.md提取每个bash代码块写入临时文件并补上#!/bin/bash头对每个代码块运行shellcheck -S warning检查针对教学片段特性排除特定规则SC2034变量看似未使用因片段间变量相互依赖、SC2154变量未赋值即引用原因同上、SC2145教育性$示例等汇总输出例如Checked N bash code blocks across M markdown files (K skipped).全部通过返回 0否则返回 1。这意味着本仓库中呈现的代码片段包括本章的read用法都经过了 shellcheck 的静态验证你在阅读和复用时可以确信其语法正确、符合 ShellCheck 的最佳实践标准。想要复现校验可运行./scripts/shellcheck-ebook.sh或指定其他语言目录如德文版内容./scripts/shellcheck-ebook.sh ebook/de/content常见错误与最佳实践小结围绕用户输入把本章及关联章节的要点汇总如下提示先行read前用echo或-p明确告知用户要输入什么交互才友好引号必加引用输入变量时使用$name防止词拆分与通配符展开带来的 bug 与安全隐患大小写敏感read name与$Name不是同一个变量请保持一致德文原版文档曾在此出现笔误处理退出状态read的返回值0 成功 / 非 0 失败可用于超时、EOF 等场景的流程控制敏感信息用-s密码类输入务必使用-s隐藏回显用-t兜底交互脚本加上超时避免脚本因等待输入而永久挂起输入校验读取后立即校验内容为空、非法字符、范围等再进入后续逻辑这是健壮脚本与玩具脚本的分水岭。完成本章后你已经打通了输出echo→ 读取read→ 变量引用$name这条交互闭环这正是后续注释、参数、条件判断与循环章节的基础。建议动手把文中的示例都实际运行一遍交互式脚本只有亲手敲过才能真正掌握。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表