Introduction to Bash Scripting 变量完全指南:赋值、引用、引号与花括号的实战用法

Introduction to Bash Scripting 变量完全指南:赋值、引用、引号与花括号的实战用法 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 的「Bash Variables」章节为核心系统讲解 Bash 变量的定义、引用、引号规则、花括号语法以及命令行参数的读取方式。你将掌握在脚本与交互式终端中正确使用变量的全部要点避免因 word splitting词拆分和 globbing通配符展开引发的隐蔽 Bug 与安全隐患并能写出与仓库中其他章节一脉相承的可维护脚本。一、Bash 变量是什么无数据类型的容器与大多数编程语言不同Bash 变量没有数据类型。同一个变量既可以存放数字也可以存放字符串甚至可以在后续重新赋值为完全不同的内容nameDevDojo # 字符串 count42 # 数字 countforty-two # 同一变量重新赋值为字符串这一点与 C、Java 等强类型语言形成鲜明对比。Bash 在内部统一把变量值当作字符串处理只有当上下文需要时例如算术运算才将其解释为数字。赋值语法非常简单核心只有一条规则nameDevDojo关键约束号前后不能有空格。这是新手最容易踩的坑——写成name DevDojo时Bash 会把name当作一个命令去执行并报错command not found。原因是 Bash 的语法解析器通过空格来分隔命令与参数name、、DevDojo会被视为三个独立的 token。引用变量时需要在变量名前面加上$符号echo $name上述命令会输出DevDojo即name变量的值。二、始终用双引号包裹变量避免词拆分与通配符展开本章节强调的最重要习惯是引用变量时始终使用双引号$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更危险的情况是变量值里含有通配符假设pattern*.txt执行echo $pattern会把当前目录下所有.txt文件名全部打印出来如果这个变量被用于rm之类的破坏性命令后果将不可预测。经验法则Rule of thumb变量一律写成$name不要写$name。唯一的常见例外是[[ ]]测试括号内部——因为[[ ]]内不发生词拆分但即使如此养成加引号的习惯仍然更安全。这条法则在本书后续章节中被反复实践例如 009-bash-conditional-expressions.md 中字符串比较都写成[[ ${string1} ${string2} ]]的形式——右侧加引号还额外避免了 glob 模式匹配的语义陷阱。三、花括号的用途何时必须使用${name}变量名还可以用花括号包裹成${name}形式。多数简单场景下两者等价但在以下情况必须使用花括号1. 变量名后紧跟可被误认为变量名一部分的字符greetingHello # 不加花括号Bash 会去寻找名为 $greetings 的变量而不是 $greeting echo $greetings world # 输出 world变量为空不存在该变量 # 加花括号明确告知变量名就是 greeting echo ${greeting}s world # 输出Hellos world这个场景在处理文件后缀、复数形式、字符串拼接时极其常见例如${file}.log、${user}s。2. 数组下标访问数组元素必须用花括号包裹否则 Bash 会解析出错my_array(value 1 value 2 value 3 value 4) echo ${my_array[1]} # 输出value 2 echo ${#my_array[]} # 输出4元素个数如 008-bash-arrays.md 所述访问数组时必须同时使用花括号和双引号这是该章节明确强调的注意事项。3. 字符串切片textABCDE echo ${text:0:2} # 输出AB echo ${text:3} # 输出DE4. 默认值等参数扩展echo ${name:-default} # name 未设置或为空时输出 default本书的写作约定是需要清晰度或消除歧义时使用花括号变量独立出现时省略。因此$name与${name}在简单场景下都是正确的。四、在脚本中使用变量从 Hello World 到多变量延续前几章创建的devdojo.sh脚本创建方式见 002-bash-structure.md 与 003-bash-hello-world.md使用文本编辑器打开文件nano devdojo.sh在#!/bin/bashshebang 行之后加入变量定义与欢迎信息#!/bin/bash nameDevDojo echo Hi there $name保存后运行脚本./devdojo.sh输出Hi there DevDojo逐行解读这个脚本行内容作用#!/bin/bashshebang指定使用/bin/bash解释器执行本脚本nameDevDojo变量赋值定义名为name的变量并赋值为DevDojoecho Hi there $name变量引用用echo把变量内容作为欢迎语输出到屏幕多变量与可选分号脚本中可以同时定义多个变量#!/bin/bash nameDevDojo greetingHello echo $greeting $name再次运行./devdojo.sh输出Hello DevDojo值得注意的是每行末尾的分号;不是必需的加不加都可以正常运行——这一点与 JavaScript 等语言类似属于可选项。但如果要把多条命令写在同一行则必须用分号分隔例如nameDevDojo; echo $name。五、从命令行读取变量位置参数$1、$2与$除了在脚本内部定义变量还可以在运行脚本时从命令行传入参数脚本内部通过位置参数读取./devdojo.sh Bobby buddy!此时脚本内容#!/bin/bash echo Hello there $1$1代表第一个命令行参数这里是Bobby$2代表第二个参数buddy!依此类推——参数按输入顺序由$加序号引用。$则一次性读取所有参数。来看章节中完整的多参数示例#!/bin/bash echo Hello there $1 # $1 : 第一个参数 echo Hello there $2 # $2 : 第二个参数 echo Hello there $ # $ : 所有参数执行./devdojo.sh Bobby buddy!输出Hello there Bobby Hello there buddy! Hello there Bobby buddy!关于位置参数还有两点值得延伸详见 007-bash-arguments.md$0用于引用脚本自身文件名可用于日志记录或获取脚本路径位置参数是本书后续 015-writing-your-first-bash-script.md 等实战章节的基础例如远程服务器批量执行脚本时需要把服务器 IP 列表作为参数传入。另外交互式读取用户输入可以使用read与read -p见 005-bash-user-input.md将用户输入存入变量的做法与本篇变量引用规则完全一致read -p What is your name? name echo Hi there $name六、变量的进阶检测判断变量是否已设置掌握变量语法后还可以用[[ ]]条件表达式检测变量的状态。在 009-bash-conditional-expressions.md 中特别指出-v操作符检测的是变量名而非变量值[[ -v varname ]]这里必须传入变量名字符串varname如果写成[[ -v ${varname} ]]则会先展开变量值再检测导致结果恒为 false。配合字符串长度检测[[ -z ${string} ]] # 字符串长度为零时为真 [[ -n ${string} ]] # 字符串长度非零时为真这些表达式与本节的花括号写法${string}组合使用正是检测变量是否已赋值的标准手段。七、仓库配套的质量保障ShellCheck 校验本仓库为保障书中所有 Bash 代码示例的正确性在 scripts/shellcheck-ebook.sh 中实现了自动化校验脚本它从ebook/en/content目录的 Markdown 文件中提取所有bash代码块逐一写入临时文件并运行 ShellCheck 检查。该脚本特意排除了 SC2034变量看似未使用、SC2154变量未赋值即引用等与教学场景相关的告警——因为书中的代码片段经常是跨小节分步演示的。这意味着本节展示的nameDevDojo、echo $name等写法均符合 ShellCheck 的警告级检查标准你可以放心在真实脚本中直接采用。八、小结与实践清单回顾本章核心知识点它们共同构成 Bash 变量使用的完整心智模型无数据类型数字与字符串可互相转换靠上下文解释赋值namevalue两侧严禁空格引用$name或${name}始终加双引号花括号用于消歧义、数组下标、字符串切片、默认值扩展位置参数$1、$2…按顺序读取命令行参数$读取全部$0为脚本自身检测[[ -v varname ]]判断变量是否已设置。建议动手练习先创建脚本定义多个变量并正确引用再尝试不加引号引用含空格的文件名观察差异最后通过命令行参数把值传入脚本。你可以在 004-bash-variables.md 原章节基础上反复验证并继续阅读本书后续章节将这些变量技能应用于用户输入、数组与条件判断等更复杂的场景。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考