如何在 Shell 中遍历数组

ShellShellBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你完成在 Shell 编程中遍历数组的过程。你将学习如何理解 Shell 数组、遍历数组元素,并探索各种技术和示例,以便在你的 Shell 脚本中有效地处理数组。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell/VariableHandlingGroup -.-> shell/arrays("Arrays") shell/ControlFlowGroup -.-> shell/for_loops("For Loops") shell/ControlFlowGroup -.-> shell/while_loops("While Loops") shell/ControlFlowGroup -.-> shell/until_loops("Until Loops") shell/AdvancedScriptingConceptsGroup -.-> shell/read_input("Reading Input") subgraph Lab Skills shell/arrays -.-> lab-414951{{"如何在 Shell 中遍历数组"}} shell/for_loops -.-> lab-414951{{"如何在 Shell 中遍历数组"}} shell/while_loops -.-> lab-414951{{"如何在 Shell 中遍历数组"}} shell/until_loops -.-> lab-414951{{"如何在 Shell 中遍历数组"}} shell/read_input -.-> lab-414951{{"如何在 Shell 中遍历数组"}} end

理解 Shell 数组

在 Shell 脚本编程领域,数组是一种强大的工具,它使你能够存储和处理数据集合。Shell 中的数组可以容纳各种数据类型,包括字符串、数字,甚至其他数组。对于任何 Shell 程序员来说,理解如何使用数组都是一项至关重要的技能。

什么是 Shell 数组?

Shell 数组是一个可以容纳多个值的变量。数组中的每个值都称为一个元素,每个元素都被分配一个唯一的索引号。在 Shell 中,数组是从零开始索引的,这意味着第一个元素的索引为 0,第二个元素的索引为 1,依此类推。

Shell 中的数组可以通过多种方式声明,例如:

## 声明一个空数组
my_array=()

## 声明一个带有初始值的数组
my_array=(value1 value2 value3)

## 逐个声明数组元素
my_array[0]=value1
my_array[1]=value2
my_array[2]=value3

访问数组元素

一旦声明了数组,你就可以使用数组名和元素的索引来访问其元素。例如:

echo ${my_array[0]} ## 输出:value1
echo ${my_array[1]} ## 输出:value2
echo ${my_array[2]} ## 输出:value3

你还可以使用 @ 符号来访问数组中的所有元素:

echo ${my_array[@]} ## 输出:value1 value2 value3

数组属性和操作

Shell 数组支持各种属性和操作,例如:

  • 确定数组的长度:${#my_array[@]}
  • 在数组末尾追加一个元素:my_array+=(new_value)
  • 从数组中删除一个元素:unset my_array[index]
  • 切片数组:${my_array[@]:start:length}

理解这些关于 Shell 数组的基本概念将有助于你在 Shell 脚本中有效地遍历和操作数组元素。

遍历数组元素

一旦你有了一个数组,接下来的步骤就是遍历其元素。Shell 提供了几种遍历数组的方法,每种方法都有其自身的优点和适用场景。

使用 for 循环

遍历数组最常见的方法是使用 for 循环。这种方法允许你逐个访问数组的每个元素:

my_array=(apple banana cherry)

for item in "${my_array[@]}"; do
  echo "$item"
done

这将输出:

apple
banana
cherry

使用基于索引的 for 循环

你也可以使用基于索引的 for 循环,通过索引来访问数组元素:

my_array=(apple banana cherry)

for i in "${!my_array[@]}"; do
  echo "${my_array[$i]}"
done

这将输出与上一个示例相同的结果。

使用 while 循环

另一种选择是结合使用 while 循环和 ${#array[@]} 语法来获取数组的长度并进行遍历:

my_array=(apple banana cherry)
i=0

while [ $i -lt ${#my_array[@]} ]; do
  echo "${my_array[$i]}"
  i=$((i + 1))
done

这也将输出与前几个示例相同的结果。

选择正确的方法

循环方法的选择取决于你的具体用例和个人偏好。for 循环通常是最简洁且易读的选项,而基于索引的 for 循环和 while 循环在你需要对数组索引执行额外操作时提供了更大的灵活性。

数组迭代技术与示例

除了上一节介绍的基本循环技术外,Shell 还提供了几种其他遍历数组元素的方法。根据你的具体需求,这些技术在不同场景中可能会很有用。

使用 select 进行迭代

Shell 中的 select 语句可用于创建一个菜单驱动的界面来与数组元素进行交互:

my_array=(apple banana cherry)

select fruit in "${my_array[@]}"; do
  echo "你选择了:$fruit"
  break
done

这将输出数组元素的编号列表,用户可以通过输入相应的数字来选择一个项目。

使用 zip 进行并行迭代

zip 命令可用于并行遍历多个数组。当你需要对来自不同数组的对应元素执行相同操作时,这很有用:

fruits=(apple banana cherry)
prices=(1.99 2.50 3.25)

for fruit, price in $(zip "${fruits[@]}" "${prices[@]}"); do
    echo "$fruit 售价为 \$${price}"
done

这将输出:

apple 售价为 $1.99
banana 售价为 $2.50
cherry 售价为 $3.25

过滤和转换数组

你还可以使用 Shell 数组操作来过滤和转换数组元素。例如,要创建一个只包含原始数组中偶数索引元素的新数组:

my_array=(apple banana cherry date elderberry)
even_array=("${my_array[@]:0:1}" "${my_array[@]:2:1}" "${my_array[@]:4:1}")

echo "${even_array[@]}" ## 输出:apple cherry elderberry

或者,将所有元素转换为大写:

my_array=(apple banana cherry)
upper_array=("${my_array[@]^^}")

echo "${upper_array[@]}" ## 输出:APPLE BANANA CHERRY

这些技术使你能够以强大而灵活的方式处理数组数据,使其成为你 Shell 编程工具库中的宝贵工具。

总结

在本教程结束时,你将对如何在 Shell 脚本中遍历数组有扎实的理解。你将能够应用不同的技术来循环遍历数组元素,并利用这些技能来提升你的 Shell 编程能力。