ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Bash 中读取用户输入:从 `read` 到 `read -p` 的交互式脚本实战(Introduction to Bash Scripting)

在 Bash 中读取用户输入:从 `read` 到 `read -p` 的交互式脚本实战(Introduction to Bash Scripting) 在 Bash 中读取用户输入从read到read -p的交互式脚本实战Introduction to Bash Scripting【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting导读本文基于开源电子书《Introduction to Bash Scripting》仓库 README.md 中的法语章节 005-entrées-utilisateur-bash.md展开系统讲解如何在 Bash 脚本中读取用户输入从基础版「echo提示 read读取」的组合到用read -p一步完成提示与读取的精简写法。读完本文你将掌握read命令的两种典型用法、$name变量的正确引用方式并理解它与上一章变量004-variables-dans-bash.md及后续命令行参数007-bash-arguments.md之间的承接关系能够独立编写出第一个真正会提问的交互式 Bash 脚本。前置准备延续devdojo.sh脚本在 003-hello-world-en-bash.md 中我们已经创建了devdojo.sh文件其第一行是 shebang#!/bin/bash告知操作系统用/bin/bash执行该脚本详见 002-structure-de-bash.md并使用chmod x devdojo.sh赋予其可执行权限。在上一章004-variables-dans-bash.md中脚本内容是通过变量名硬编码的方式输出欢迎语#!/bin/bash nameDevDojo echo Hi there $name运行./devdojo.sh后固定输出Hi there DevDojo。这种方式的问题是每次运行输出都一样脚本无法与用户产生任何交互。本章要解决的正是这个问题——让脚本停下来等待用户输入再根据输入内容给出响应。第一个交互脚本echo提示 read读取打开你常用的文本编辑器例如nano devdojo.sh将脚本修改为如下内容#!/bin/bash echo Quel est votre nom ? read name echo Salut $name echo Bienvenue sur DevDojo !逐行拆解这个脚本#!/bin/bashshebang声明使用 Bash 解释器echo Quel est votre nom ?向屏幕输出提示语询问用户姓名read name暂停脚本执行等待用户在键盘上输入一行文本按回车后把输入内容存入变量nameecho Salut $name与echo Bienvenue sur DevDojo !将变量内容嵌入字符串中回显给用户。read是 Bash 的内建命令builtin它的核心作用就是从标准输入读取一行并将其中的内容赋值给一个或多个变量。在这个例子中read name将用户输入的内容作为字符串/文本存储到变量name中之后就可以像使用普通变量一样引用它。实际运行效果首先运行脚本./devdojo.sh此时脚本会打印提示语并等待输入你在终端中输入自己的名字例如BobbyQuel est votre nom ? Bobby按下回车后脚本继续执行并输出Salut Bobby Bienvenue sur DevDojo !可以看到$name被替换成了我们刚才输入的Bobby——脚本第一次做到了因人而异地输出结果。精简写法用read -p一步完成提示与读取上面的基础版需要两行代码一行echo提示、一行read读取。为了压缩代码量Bash 的read命令提供了-p标志prompt提示read -p会在等待用户输入之前先把提示消息打印到屏幕上。于是上面的脚本可以精简为#!/bin/bash read -p Quel est votre nom ? name echo Salut $name echo Bienvenue sur DevDojo!这里read -p Quel est votre nom ? name一条命令就完成了打印提示 读取输入 存入变量三件事。注意提示字符串末尾保留了空格这样用户输入时提示语与输入内容之间会有自然的间隔。运行效果与基础版完全一致但脚本从 5 行缩减到了 3 行可读性和维护性都更好。这也是真实项目中最常见的写法——几乎所有需要交互确认的脚本都会使用read -p。建议两个版本都亲自在终端运行一遍体会echoread与read -p的等价关系并试着输入包含空格的名字例如Jean Pierre观察输出这有助于你理解变量引用的行为。进阶正确引用变量避免引号陷阱在本章的示例中我们一直在双引号内引用变量Salut $name。这一点并非无关紧要而是 004-variables-dans-bash.md 中强调的最重要习惯之一引用变量时始终使用双引号写$name而不是$name。原因在于不加引号时Bash 会对变量的值执行分词word splitting和通配符展开globbing。例如#!/bin/bash filenamemy file.txt # 错误 - Bash 会把变量拆成两个词my 和 file.txt touch $filename # 实际创建了两个文件my 和 file.txt # 正确 - 引号把整个值作为一个参数保留 touch $filename # 只创建一个文件my file.txt如果把这条规则应用到本章场景当用户输入包含空格或通配符*、?的内容时不加引号的echo $name可能产生无法预期的输出。因此请坚持$name的写法当变量名后面紧跟其他字符、可能被误认为变量名的一部分时还需要用花括号明确边界即${name}例如${name}s。从源码结构看本书后续各章如 008-bash-arrays.md、009-bash-conditional-expressions.md的所有示例也都遵循了双引号引用的惯例。从交互输入到命令行参数一次输入的两种来源阅读用户输入是让脚本接收外部数据的一种方式本书紧接着的章节 007-bash-arguments.md 会介绍另一种——命令行参数。两者常常配合使用理解它们的区别很重要read运行时交互脚本执行到该行时暂停等待用户在终端输入命令行参数启动时传入在命令后直接追加脚本内通过位置变量引用。例如在脚本内部$1引用第一个参数、$2引用第二个参数、$引用全部参数详见 007-bash-arguments.md 中的arguments.sh示例。本书英文原版 005-bash-user-input.md 与法语版内容一一对应法语版 007-bash-arguments.md 也延续了同样的devdojo.sh教学脉络。仓库内的质量保障代码块的 shellcheck 校验值得一提的细节是本仓库在 scripts/shellcheck-ebook.sh 中提供了一个自动化脚本它会从 ebook 的 Markdown 文件中提取所有bash代码块逐一写入临时文件并交给 shellcheck 做静态检查只有全部通过才认为 ebook 的代码示例是合格的。该脚本对read相关示例的处理方式见 scripts/shellcheck-ebook.sh有两点值得注意它为每个代码块自动补上#!/bin/bashshebang 后再校验与本书一贯的教学约定一致它排除了一批仅在教学语境下才合理的检查项例如SC2154变量被引用但未赋值——正是因为我们本章用read在运行时给$name赋值静态分析器无法预知这类警告在教学示例中是被有意放行的。这从侧面印证了read赋值的变量只有在运行时才存在值静态检查工具如 shellcheck无法推断其内容因此实践中更应在使用时做好引号保护。动手验证完整实验清单为了巩固本章内容建议按顺序完成以下实验用nano devdojo.sh写入基础版脚本echoread./devdojo.sh运行并输入名字改写为read -p精简版确认输出一致输入含空格的名字如Jean Pierre观察Salut $name是否正确保留整个名字对比去掉引号的写法echo Salut $name在输入含*时的行为差异体会 004-variables-dans-bash.md 中引号规则的实战意义可选在仓库根目录运行./scripts/shellcheck-ebook.sh查看电子书中所有代码块包括本章的两个脚本是否都能通过 shellcheck 校验。小结本章的核心收获可以浓缩为三点read name是 Bash 中最基础的交互输入方式暂停脚本、读取一行、存入变量read -p 提示语 name用一条命令同时完成提示与读取是实际项目中的首选写法无论哪种写法读取到的变量都应在双引号中引用$name这是避免分词与通配符展开陷阱、保证脚本健壮性的关键习惯。从 003-hello-world-en-bash.md 的固定输出到本章的交互式输入再到下一章 007-arguments-bash.md 的命令行参数你的脚本正在一步步从一次性工具进化为可复用的自动化组件。本章的read能力将在本书后续的实战章节如交互式菜单 016-création-d-un-menu-interactif-en-bash.md、多服务器批量执行 017-execution-des-scriptes-bash-sur-des-serveurs-distants-multiples.md 等中被反复使用值得你亲手多敲几遍。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表