ARTICLE DETAIL

资讯详情

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

Bash 数组完全指南:初始化、索引访问、@/ 展开与切片详解 —— 《Introduction to Bash Scripting》电子书第 008 章深度解读

Bash 数组完全指南:初始化、索引访问、@/ 展开与切片详解 —— 《Introduction to Bash Scripting》电子书第 008 章深度解读 Bash 数组完全指南初始化、索引访问、/# 展开与切片详解 —— 《Introduction to Bash Scripting》电子书第 008 章深度解读【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting本篇围绕开源电子书Introduction to Bash Scripting的第 008 章西班牙语版原稿位于 ebook/sp/assets/content/008-bash-arrays.md英文版位于 ebook/en/content/008-bash-arrays.md系统讲解 Bash 数组的初始化、按索引/负索引访问、与#展开、数组切片与字符串切片。读完并亲手跑通文中全部示例后你将能够正确编写、遍历和截取 Bash 数组并避开“第二参数是结束索引”这类常见误区。一、为什么 Bash 需要数组一个名字装多个值如果你写过任何编程语言应该已经熟悉数组。如果不是开发者只需要记住核心概念与普通变量不同数组可以在同一个名字下保存多个值。普通 Bash 变量一次只能绑定一个值而数组让你把一组相关数据如一组主机名、一串日志文件、一批用户输入整体保存、整体展开、按需取用。在本书的章节编排中数组008 章紧接在“命令行参数”007 章之后这正是设计意图$、$#等参数展开与数组展开在语义上高度同构理解了参数就能更快理解数组。完整章节列表可见 README.md 中的 “Chapters” 小节。阅读提示西班牙语版章节由机器翻译生成正文中“matrices”即“数组”array、“eco”即echo、代码块标记“golpecito”即 bash 代码块。复制其中代码时必须改回真正的bash围栏和echo命令否则无法运行——这一点在 ebook/sp/assets/content/008-bash-arrays.md 原文中可直接确认。下文所有示例均已使用正确的 bash 语法并在 Bash 5.2.15 下实测验证。二、数组的初始化用空格分隔的值包在 () 中数组初始化语法是赋值一个由空格分隔、外加深括号()的值序列my_array(value 1 value 2 value 3 value 4)西班牙语章节给出的等价写法翻译为正确 bash 后是letras(ABCDE)这里有一个容易看漏的坑值得单独展开AB这样相邻的加引号字面量在词法上会直接拼接。实测验证$ letras(ABCDE) $ echo ${letras[]} ABCDE $ echo ${#letras[]} 1也就是说letras实际上只有1 个元素其值是字符串ABCDE。这正是西班牙语章节“切片示例”能成立的前提——${letras:0:2}并非对“多个元素的数组”切片而是对这个单元素做字符串子串展开详见第五节。若想真正得到 5 个元素的数组应写成letras(A B C D E)。三、访问数组元素数字索引、负索引、 与访问数组元素时用数字索引引用。西班牙语章节明确提示展开数组时必须使用花括号{}英文版补充并建议用双引号包裹展开结果。以my_array(value 1 value 2 value 3 value 4)为例四种核心展开方式与实测输出如下展开式含义实测输出echo ${my_array[1]}访问单个元素索引从 0 开始value 2echo ${my_array[-1]}访问最后一个元素负索引Bash 4.0value 4echo ${my_array[]}展开全部元素类似命令行参数的$value 1 value 2 value 3 value 4echo ${#my_array[]}#前缀得到元素总数4逐条对应原章节的四段示例# 访问单个元素输出: value 2 echo ${my_array[1]} # 返回最后一个元素输出: value 4 echo ${my_array[-1]} # 使用 返回数组中所有元素输出: value 1 value 2 value 3 value 4 echo ${my_array[]} # # 前缀输出元素总数输出: 4 echo ${#my_array[]}几个要点索引从 0 开始所以第二个元素的下标是1负索引-1表示最后一个元素该能力要求 Bash 4.0 及以上本书英文版数组切片一节也标注了 “requires Bash 4.0”[]展开时每个元素是独立单词这是“展开所有元素”的标准写法原章节最后也提醒读者“Make sure to test this and practice it at your end with different values”务必自己动手用不同的值测试练习下文所有输出均可按此复现。四、数组切片Array SlicingBash 4.0英文版 008-bash-arrays.md 指出Bash 不支持“真正的”任意数组切片语法但通过“数组索引 ${array[]:offset:length}参数展开组合”可以达到类似效果。完整可运行示例如下全部实测通过#!/bin/bash array(A B C D E) # Print entire array echo ${array[]} # Output: A B C D E # Access a single element echo ${array[1]} # Output: B # Print a range of elements (requires Bash 4.0) echo ${array[]:1:3} # Output: B C D # Print from an index to the end echo ${array[]:3} # Output: D E实测输出A B C D E B B C D D E注意${array[]:1:3}的语义从下标 1元素B开始最多取 3 个元素得到B C D省略长度则取到数组末尾如${array[]:3}输出D E。英文版同时给出两条使用纪律原文为“When working with arrays, always use[]to refer to all elements, and enclose the parameter expansion in quotes to preserve spaces in array elements.”操作数组时始终使用[]表示全部元素并把参数展开放入引号中以保留元素内部空格。这与第三节my_array中含空格的元素值直接呼应不加分词保护的展开会把value 1拆成两个单词。五、字符串切片逐条验证西班牙语章节的 4 个示例西班牙语章节的 “Subcadena en Bash字符串截取” 小节给出了基于letras( ABCDE)的四段示例。由于第二节已证实该数组实际是单元素ABCDE这些示例本质上是Bash 字符串子串展开${variable:offset:length}的演示。逐条实测验证如下。示例 0打印整个数组#!/bin/bash letras(ABCDE) echo ${letras[]} # 输出: ABCDE示例 1${letras:0:2}#!/bin/bash letras(ABCDE) b${letras:0:2} echo ${b} # 输出: AB原文描述为“从初始索引 0 到 2其中 2 是排他的”donde 2 es exclusivo。这里需要更精确的语义第二个数2 是最大字符数length不是结束索引。${letras:0:2}取元素 0即ABCDE从下标 0 起最多 2 个字符得到AB。英文版对这一点的表述更严谨“the second number in the slice notation represents the maximum length of the extracted substring, not the ending index”。示例 2${letras::5}省略起始索引#!/bin/bash letras(ABCDE) b${letras::5} echo ${b} # 输出: ABCDE起始索引缺省为 0长度上限 5正好取满整串ABCDE。示例 3${letras:3}省略长度取到末尾#!/bin/bash letras(ABCDE) b${letras:3} echo ${b} # 输出: DE从下标 3 开始一直取到字符串末尾输出DE。边界行为长度越界不会报错。英文版补充的关键规则是若指定长度超出剩余字符数Bash 只在字符串末尾截断不抛错。实测textABCDE echo ${text:3:3} # 输出: DE只剩 2 个字符自动截断 textHello, World! echo ${text:7:5} # 输出: World echo ${text:7:10} # 输出: World!只要 6 个可用字符尽管请求了 10 个这个“宁可短、不报错”的行为在处理长度不定的输入时特别有用。英文版还提醒这与 Python 等语言把第二个参数当“结束索引”的习惯不同移植代码时要特别注意。一个高价值陷阱${arr:0:2}与${arr[]:0:2}不是同一回事。实测对比$ letras(ABCDE) $ echo ${letras:0:2} AB $ echo ${letras[]:0:2} ABCDE前者是字符串子串展开作用于数组第 0 个元素的字符串后者是Bash 4.0 的数组切片取下标 0 起的元素这里只剩 1 个元素所以是ABCDE。西班牙语章节示例之所以“看起来像数组切片却输出 AB”根源正在于此若你的数组是多元素的(A B C D E)${letras:0:2}只会对第一个元素A做字符串展开结果完全不同。写脚本时务必先确认自己面对的是字符串展开还是数组切片。六、仓库层面的佐证这些示例是如何被把关的本书的示例代码并非“写完即止”。仓库提供了 scripts/shellcheck-ebook.sh它会遍历英文电子书的 Markdown 文件默认ebook/en/content提取每个bash代码块为其注入#!/bin/bash头后写入临时文件再逐块执行shellcheck -S warning见 scripts/shellcheck-ebook.sh#L100-L111# Write block to a temp file with a shebang block_file$tmpdir/${filename}_block_${block_num}.sh printf #!/bin/bash\n%s\n $block_content $block_file # Run shellcheck if ! output$(shellcheck -S warning -e $EXCLUDE $block_file 21); then脚本还对教学场景做了针对性豁免scripts/shellcheck-ebook.sh#L26-L33例如 SC2145教学性的$混用示例、SC2043故意演示错误写法的循环并跳过 crontab 语法行、select菜单输出等“非可运行 bash”的块。运行方式./scripts/shellcheck-ebook.sh # 默认检查 ebook/en/content ./scripts/shellcheck-ebook.sh ebook/en/content退出码 0 表示全部代码块通过1 表示存在 warning。这正是本文所有数组示例可以放心复制运行的原因英文版的008-bash-arrays.md位于该脚本默认检查目录内其中的数组与切片代码块均处于 shellcheck 的持续校验之下。出版管线方面README.md 说明本书使用 Ibis一个用 Markdown 撰写电子书的 PHP 工具生成 PDF/ePub各语言目录下配有 Ibis 配置文件如 ebook/sp/assets/ibis.php含书名、作者、字体与 sample 页范围等配置和 ebook/pt_br/epub.yml最终产物存放在语言目录的export/下如英文版 ebook/en/export/ 中的明/暗主题 PDF 与 ePub。七、快速参考与小结语法类型含义实测示例输出arr(a b c)定义初始化数组—${arr[1]}索引取第 2 个元素value 2${arr[-1]}索引Bash 4.0取最后一个元素value 4${arr[]}展开全部元素逐个成词value 1 value 2 value 3 value 4${#arr[]}计数元素总数4${arr[]:1:3}数组切片Bash 4.0从下标 1 起最多取 3 个元素B C D${arr[]:3}数组切片从下标 3 起取到末尾D E${str:0:2}/${var:offset:length}字符串切片最多取 length 个字符越界自动截断AB/World!小结三点数组让一个变量名绑定一组值初始化用空格分隔加()展开时务必带花括号并加引号防止含空格元素被拆词[]表示全部元素#前缀表示计数负索引取尾部Bash 4.0区分字符串子串展开${var:offset:length}与数组切片${arr[]:offset:length}——前者的第二参数是“最大长度”而非“结束索引”越界静默截断西班牙语章节的letras示例正是基于单元素数组的字符串切片演示直接照抄语法而忽略其单元素本质是初学者最容易踩的坑。配合本书后续章节条件表达式、循环把数组展开放进for循环即可覆盖绝大多数批量处理场景例如遍历主机清单、日志文件列表——这正是 Bash 自动化脚本的基本功。【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表