
Bash 数组与切片实战来自 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 中有完整章节索引第 8 章《Bash Arrays》的深度技术解读。你将学会如何声明与初始化 Bash 数组、通过索引访问单个元素、用与#获取全部元素与元素个数并掌握数组切片与字符串切片substring slicing的准确语法与边界行为。读完本文你可以在日常 SysOps / DevOps 自动化脚本中熟练使用数组批量处理文件列表、主机清单与参数集合并避开常见的引号与长度语义陷阱。数组的本质一个名字装下多个值如果你写过任何编程语言大概率已经接触过数组这一概念。但即使你不是专职开发者也只需要记住 Bash 中数组最核心的一条与普通变量不同数组可以在同一个名字下存放多个值。普通变量只能保存一个值例如在 ebook/es/content/004-bash-variables.md 中介绍过的nombreDevDojo而数组可以把一串值打包在一起my_array(value 1 value 2 value 3 value 4)初始化数组的规则非常简单用空格分隔多个值并用()圆括号整体括起来。数组下标索引从0开始计数这一点与大多数编程语言一致也与本书 ebook/es/content/007-bash-arguments.md 中讲到的位置参数$1、$2的按位置取值思想一脉相承。访问数组元素索引、负索引与特殊符号要访问数组中的元素需要按数字索引引用它。访问时必须使用${}花括号包裹数组名和下标echo ${my_array[1]}这行命令输出value 2——因为索引从 0 开始[1]取到的是第二个元素。负索引取最后一个元素Bash4.2 及以上版本支持负索引-1表示最后一个元素echo ${my_array[-1]}输出结果为value 4。展开全部元素和命令行参数$的用法类似参见本书关于参数一章在数组中用可以一次性展开所有元素echo ${my_array[]}输出结果为value 1 value 2 value 3 value 4#统计元素个数在数组名前面加#符号可以得到数组中元素的总数echo ${#my_array[]}对于我们的示例数组输出为4。提示数组展开时务必使用[]而不是[*]并将整个参数展开用双引号包起来。双引号能确保元素中的空格被保留例如value 1不会被拆成value和1两个 token。英文原版章节 ebook/en/content/008-bash-arrays.md 特别强调始终用引号包裹数组展开以保留数组元素中的空格。建议读者把上述四种访问方式组合起来换不同的值反复练习直到形成直觉。数组切片从数组中截取一段Bash 并没有像 Python 那样原生、完整的数组切片语法但通过参数展开parameter expansion的切片形式${array:start:length}可以实现非常接近的效果。以下示例均可在终端中直接复制运行#!/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[]:1:3}表示从索引1开始最多取3个元素输出B C D${array[]:3}省略了长度参数表示从索引3一直取到数组末尾输出D E数组切片语法依赖 Bash 4.0 及以上版本低版本环境下会报错或行为不同使用时请先确认bash --version。字符串切片substring 截取在西班牙语版章节 ebook/es/content/008-bash-arrays.md 中作者用一组letras数组演示了切片的用法。下面是其基础版本#!/bin/bash letras( A B C D E ) echo ${letras[]}这段代码会把数组所有元素打印出来未加引号时元素拼接在一起输出ABCDE接着看三个递进的切片示例示例 1从索引 0 开始截取到索引 2不含#!/bin/bash letras( A B C D E ) b${letras:0:2} echo ${b}${letras:0:2}从索引0开始截取2是排他性上界因此输出AB示例 2省略起始索引从 0 到 5不含#!/bin/bash letras( A B C D E ) b${letras::5} echo ${b}起始索引缺省为05仍然排他因此输出完整的ABCDEABCDE示例 3从索引 3 到数组末尾#!/bin/bash letras( A B C D E ) b${letras:3} echo ${b}省略长度参数表示一直截取到末尾含末尾输出DE字符串切片的通用语法与两个易错点把上述行为推广到普通字符串Bash 的切片语法是${string:start:length}其中start是起始索引从0开始计数length是最多提取的字符数最大长度而不是结束索引。这一点与 Python 等语言的切片语义不同是两个最容易被误解的点第二个数字是长度不是结束索引。例如${text:1:3}是从索引 1 起提取 3 个字符而不是提取到索引 3。当请求的长度超出字符串剩余部分时Bash 不会报错而是安静地在字符串末尾停下。看下面的完整示例#!/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 个字符再举一个更贴近日常的字符串例子textHello, World! # 从索引 7 开始提取 5 个字符 echo ${text:7:5} # 输出: World # 请求 10 个字符但索引 7 之后只剩 6 个字符 echo ${text:7:10} # 输出: World!第二个echo虽然请求了 10 个字符Bash 只返回可用的 6 个字符。这种取不足就停的宽容行为在你不确定字符串确切长度时非常有用——不需要先测量长度、再小心翼翼地计算边界直接指定一个足够大的长度即可安全地取到末尾。如何验证与运行本文代码将上述任意脚本保存为.sh文件例如arrays.sh第一行保留#!/bin/bashshebangshebang 的作用详见本书 ebook/es/content/002-bash-structure.md它告诉系统用/bin/bash解释执行脚本然后bash arrays.sh直接运行即可也可以不建文件直接在交互式终端里逐行输入bash进入 shell 后测试若系统安装了 ShellCheck可以用它做静态检查。本仓库提供了自动化校验脚本 scripts/shellcheck-ebook.sh它会自动抽取电子书所有 Markdown 中的 bash 代码块逐一运行shellcheck其中对教程类代码片段豁免了 SC2034变量看似未使用、SC2154变量引用未赋值等规则——这正说明书中许多变量是为后续代码块服务的教学示例而非真正未使用。小结Bash 数组是编写自动化脚本时最实用的数据结构之一。本文完整覆盖了本书第 8 章的全部知识点操作语法说明初始化arr(v1 v2 v3)空格分隔、()包裹访问单元素${arr[1]}索引从 0 开始访问最后元素${arr[-1]}负索引Bash 4.2展开全部元素${arr[]}等价于参数的$统计元素个数${#arr[]}前缀#数组切片${arr[]:1:3}需 Bash 4.0字符串切片${str:start:length}第二参数是长度而非结束索引建议结合本仓库的完整章节体系继续学习在 ebook/en/content/008-bash-arrays.md 可以阅读英文原版对照而后续章节如 ebook/en/content/011-bash-loops.md 循环、ebook/en/content/017-executing-bash-script-on-multiple-remote-server.md 多服务器执行中数组将与循环、参数展开组合出强大的批处理能力。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考