Introduction to Bash Scripting 实战:Bash 数组定义、访问、切片与字符串切片完全指南

发布时间:2026/9/17 2:30:58
Introduction to Bash Scripting 实战:Bash 数组定义、访问、切片与字符串切片完全指南 Introduction to Bash Scripting 实战Bash 数组定义、访问、切片与字符串切片完全指南【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting导读本文是开源电子书 Introduction to Bash Scripting 中第 8 章「Bash Arrays」的深度技术解读聚焦 Bash 数组Array的初始化、元素访问、数组切片Array Slicing与字符串切片String Slicing四大核心能力。无论你是 DevOps/SysOps 工程师、后端开发者还是 Linux 爱好者数组都是把多个值组织在一个变量名下、配合循环批量处理数据的关键工具。读完本文你将掌握数组的完整语法、${array[]}与${#array[]}等参数展开的准确用法、Bash 4.0 的切片特性以及如何通过仓库中的 shellcheck 校验脚本 保证数组脚本的质量。为什么需要数组多个值一个名字如果你有过任何编程经验数组对你来说应该并不陌生即使你不是专业开发者也只需要记住最关键的一点与普通变量不同数组可以在一个名字下保存多个值。普通变量一次只能容纳一个值nameDevDojo echo $name # 输出: DevDojo而数组可以一次性容纳一串值例如一组用户名、一组服务器 IP、一组文件名。这正是后续章节如 for 循环遍历数组、批量操作远程服务器得以高效实现的数据基础。数组初始化空格分隔 圆括号在 Bash 中初始化数组的方式非常直观把用空格分隔的值用圆括号()包裹起来赋值给变量名即可my_array(value 1 value 2 value 3 value 4)与 Bash 变量章节 中强调的规则一致等号两侧不能有空格。同时注意这里的value 1之所以使用双引号是为了让包含空格的值作为一个整体元素存储而不是被拆成value和1两个独立元素。数组在脚本中的实际用法可参见 011-bash-loops.md 中的示例users(devdojo bobby tony)访问数组元素数字索引与参数展开要访问数组中的元素需要通过数字索引index来引用。索引从 0 开始计数。注意数组展开时必须使用花括号{}包裹并且用双引号包裹整个表达式。以下四种访问方式覆盖了日常 90% 以上的数组操作场景1. 访问单个元素echo ${my_array[1]} # 输出: value 2索引[1]指向数组的第二个元素因为第一个元素索引是 0。2. 访问最后一个元素负索引echo ${my_array[-1]} # 输出: value 4负索引从数组末尾向前计数-1即最后一个元素。此特性需要较新版本的 Bash 支持负索引自 Bash 4.2 起可用在编写面向旧系统如 macOS 自带的老版本 Bash的脚本时需注意兼容性。3. 访问全部元素echo ${my_array[]} # 输出: value 1 value 2 value 3 value 4符号与 命令行参数 中的$语义一致——返回所有内容。${array[]}会把每个元素作为独立参数展开这是配合for循环遍历数组的标准写法for user in ${users[]} do echo $user done完整示例见 011-bash-loops.md。4. 获取元素个数echo ${#my_array[]} # 输出: 4在数组展开前加上井号#即可得到数组的元素总数。这个写法常用于循环边界判断或参数个数校验。一定要动手测试建议在终端中逐条执行上面的命令并更换不同的值来观察输出例如加入带空格的元素、空元素、数字元素等以加深对索引与展开行为的理解。关于引号与花括号的深层原因双引号不加引号时Bash 会对值执行分词word splitting与通配符展开globbing导致含空格或*、?的元素被错误拆分或展开。这一点在 004-bash-variables.md 中有专门的引用变量小节强调数组展开同理。花括号数组的[index]与切片语法:start:length都属于参数展开的修饰符必须用${...}形式包裹Bash 才能正确解析同时花括号还能避免变量名与后续字符粘连产生歧义。数组切片用索引区间取子数组Bash 本身并不提供像 Python 那样完整的数组切片语法但可以通过数组索引 字符串切片的组合方式实现近似效果。数组切片要求 Bash 4.0#!/bin/bash array(A B C D E) # 打印整个数组 echo ${array[]} # 输出: A B C D E # 访问单个元素 echo ${array[1]} # 输出: B # 打印一段区间内的元素需要 Bash 4.0 echo ${array[]:1:3} # 输出: B C D # 从某个索引打印到末尾 echo ${array[]:3} # 输出: D E语法拆解${array[]:start:length}表示从索引start开始取length个元素。省略:length时则从start一直取到数组末尾。使用数组时的两条铁律引用全部元素时始终使用[]而非[*]配合引号使用参数展开始终用双引号包裹以保留数组元素内部的空格防止分词破坏数据。字符串切片${string:start:length}除了数组字符串同样支持切片提取。Bash 字符串切片的基本语法为${string:start:length}其中start起始索引从 0 开始length最多提取的字符数。来看几个逐步加深的例子#!/bin/bash textABCDE # 从索引 0 开始最多取 2 个字符 echo ${text:0:2} # 输出: AB # 从索引 3 取到末尾 echo ${text:3} # 输出: DE # 从索引 1 开始取 3 个字符 echo ${text:1:3} # 输出: BCD # 长度超出剩余字符时取到末尾即停止 echo ${text:3:3} # 输出: DE只剩 2 个字符与 Python 的关键差异需要特别留意切片记法中的第二个数字表示最大提取长度而不是结束索引。这一点与 Python 等语言不同。若指定的长度超过了字符串剩余部分Bash 不会报错而是直接停在字符串末尾textHello, World! # 从索引 7 开始取 5 个字符 echo ${text:7:5} # 输出: World # 尝试从索引 7 开始取 10 个字符 # 尽管后面只剩 6 个字符 echo ${text:7:10} # 输出: World!第二个例子中即使请求了 10 个字符Bash 也只返回从索引 7 到末尾的 6 个可用字符。这个自动截断、绝不越界报错的特性在你无法确定字符串确切长度时特别有用——例如解析用户输入、处理日志行、截取文件名后缀等场景。数组与命令行参数的对照数组的展开并非孤立概念它与命令行参数机制同源脚本位置参数$1、$2、$3本质上就是一个位置索引的集合$表示全部参数详见 007-bash-arguments.md。理解这一点后你会发现${my_array[]}与$在语义和行为上是完全对称的这也有助于解释为什么for arg in $与for item in ${array[]}的循环写法如此相似。仓库内的质量保障shellcheck 校验脚本本仓库为英文电子书的所有 Bash 代码块提供了一项额外的质量保障脚本 scripts/shellcheck-ebook.sh 会扫描ebook/en/content目录下的所有 Markdown 文件提取其中的bash代码块逐一写入临时文件并运行shellcheck静态检查。该脚本对教程类代码块做了一些合理的豁免配置其中与本数组章节直接相关的两条是SC2034变量声明后未使用片段中定义的变量可能在后续片段才被使用SC2154引用了未赋值的变量同样是跨片段教学场景下的正常现象。这意味着你在本章中看到的每个数组与切片示例都已经经过 shellcheck 的语法与常见陷阱检查故意演示错误的代码块与纯输出块会被跳过可以放心复制到自己的终端中运行练习。运行方式为./scripts/shellcheck-ebook.sh # 或指定其他章节目录 ./scripts/shellcheck-ebook.sh ebook/en/content此外本章作为电子书 README.md 中前 13 章打牢 Bash 基础序列的第 8 章其构建配置位于 ebook/en/ibis.php配合 Ibis 工具即可将 Markdown 章节渲染为 PDF/EPUB 成品成品输出位于 ebook/en/export 目录。小结本章核心速查表操作语法输出以my_array(value 1 value 2 value 3 value 4)为例初始化数组arr(a b c)空格分隔、圆括号包裹访问单个元素${my_array[1]}value 2访问最后一个元素${my_array[-1]}value 4访问全部元素${my_array[]}value 1 value 2 value 3 value 4元素个数${#my_array[]}4数组切片${array[]:1:3}从索引 1 起取 3 个元素Bash 4.0字符串切片${text:0:2}从索引 0 起最多取 2 个字符数组是 Bash 脚本从单值处理走向批量处理的分水岭掌握本章的初始化、[]/[#]展开、负索引、数组与字符串切片后你就能顺畅衔接下一章的循环遍历并进一步挑战远程服务器批量执行、日志解析等真实场景脚本详见 015-writing-your-first-bash-script.md 及后续实战章节。务必亲手运行文中的每一个例子因为索引从 0 开始、负索引、切片长度语义这些细节只有通过实际输出才能真正内化。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考