如何在 Shell 中将公共元素存储到新数组中

ShellShellBeginner
立即练习

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

简介

Shell 编程提供了一种强大且通用的方式来处理数据,包括处理数组。在本教程中,我们将探讨如何在一个新数组中识别并存储多个数组中的公共元素,这是 Shell 脚本编程中的一项常见任务。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) shell/VariableHandlingGroup -.-> shell/arrays("Arrays") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/for_loops("For Loops") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/AdvancedScriptingConceptsGroup -.-> shell/read_input("Reading Input") subgraph Lab Skills shell/arrays -.-> lab-417516{{"如何在 Shell 中将公共元素存储到新数组中"}} shell/if_else -.-> lab-417516{{"如何在 Shell 中将公共元素存储到新数组中"}} shell/for_loops -.-> lab-417516{{"如何在 Shell 中将公共元素存储到新数组中"}} shell/cond_expr -.-> lab-417516{{"如何在 Shell 中将公共元素存储到新数组中"}} shell/read_input -.-> lab-417516{{"如何在 Shell 中将公共元素存储到新数组中"}} end

Shell 数组简介

在 shell 脚本编程的世界里,数组是强大的数据结构,能让你存储和处理元素集合。Shell 数组用途广泛,可用于各种目的,比如存储文件列表、用户输入或配置设置。

理解 Shell 数组

Shell 数组是一个可以容纳多个值的变量。数组中的每个值都称为一个元素,每个元素都被分配一个索引号。在 shell 脚本中,数组通常由 @ 符号表示,单个元素可以使用它们的索引号来访问。

以下是在 Ubuntu 22.04 中声明和初始化一个 shell 数组的示例:

## 声明一个数组
my_array=(apple banana cherry)

## 访问单个元素
echo ${my_array[0]} ## 输出:apple
echo ${my_array[1]} ## 输出:banana
echo ${my_array[2]} ## 输出:cherry

在这个示例中,我们创建了一个名为 my_array 的数组,它有三个元素:applebananacherry。我们可以通过引用其索引号(从 0 开始)来访问每个元素。

常见的数组操作

Shell 脚本提供了一系列用于处理数组的内置命令和语法。一些最常见的数组操作包括:

  • 向数组追加元素:my_array+=(new_element)
  • 获取数组的长度:${#my_array[@]}
  • 遍历数组元素:for element in "${my_array[@]}"; do... done
  • 在数组中搜索元素:if [[ " ${my_array[@]} " == *" element "* ]]; then... fi

通过理解这些基本的数组操作,你可以开始编写更复杂的 shell 脚本,利用数组的强大功能来存储和处理数据。

识别数组中的公共元素

在处理多个数组时,识别它们之间的公共元素通常很有用。这在各种场景中都可能有帮助,比如查找重复文件、合并配置设置或进行数据分析。

使用 comm 命令

在 shell 数组中识别公共元素的一种方法是使用 comm 命令。comm 命令逐行比较两个已排序的文件,并生成三列输出:第一个文件独有的行、第二个文件独有的行以及两个文件共有的行。

以下是在 Ubuntu 22.04 中使用 comm 查找两个数组之间公共元素的示例:

## 定义两个数组
array1=(apple banana cherry)
array2=(banana cherry orange)

## 将数组转换为临时文件
tmp1=$(mktemp)
tmp2=$(mktemp)
printf '%s\n' "${array1[@]}" > "$tmp1"
printf '%s\n' "${array2[@]}" > "$tmp2"

## 使用 comm 查找公共元素
comm -12 "$tmp1" "$tmp2"
## 输出:banana cherry

## 清理临时文件
rm "$tmp1" "$tmp1"

在这个示例中,我们首先定义了两个数组 array1array2。然后,我们使用 mktemp 命令和 printf 命令将数组转换为临时文件。最后,我们使用带有 -12 选项的 comm 命令来查找两个文件之间的公共元素,这些公共元素对应于两个数组之间的公共元素。

使用集合操作

在 shell 数组中识别公共元素的另一种方法是使用集合操作,比如交集或并集。你可以使用各种 shell 结构和内置命令来实现这一点。

以下是在 Ubuntu 22.04 中使用集合交集查找两个数组之间公共元素的示例:

## 定义两个数组
array1=(apple banana cherry)
array2=(banana cherry orange)

## 使用集合交集查找公共元素
common_elements=()
for element in "${array1[@]}"; do
  if [[ " ${array2[*]} " == *" $element "* ]]; then
    common_elements+=("$element")
  fi
done

echo "${common_elements[@]}"
## 输出:banana cherry

在这个示例中,我们遍历 array1 的元素,并使用 [[... ]] 结构检查每个元素是否存在于 array2 中。如果在两个数组中都找到了某个元素,我们就将其添加到 common_elements 数组中。

通过理解这些在 shell 数组中识别公共元素的技术,你可以编写更强大、更高效的 shell 脚本来处理复杂的数据结构。

将公共元素存储到新数组中

在识别出两个或多个数组之间的公共元素之后,下一步就是将这些公共元素存储到一个新数组中。这在各种场景中都可能很有用,比如创建一个唯一的项目列表、对公共元素执行进一步的操作,或者在 shell 脚本的不同部分之间共享公共数据。

使用集合操作

将公共元素存储到新数组中的一种方法是使用集合操作,这与我们在上一节中讨论的方法类似。以下是在 Ubuntu 22.04 中实现此操作的示例:

## 定义两个数组
array1=(apple banana cherry)
array2=(banana cherry orange)

## 查找并将公共元素存储到新数组中
common_elements=()
for element in "${array1[@]}"; do
  if [[ " ${array2[*]} " == *" $element "* ]]; then
    common_elements+=("$element")
  fi
done

echo "Common elements: ${common_elements[@]}"
## 输出:Common elements: banana cherry

在这个示例中,我们遍历 array1 的元素,并检查每个元素是否存在于 array2 中。如果在两个数组中都找到了某个元素,我们就将其添加到 common_elements 数组中。

使用 comm 命令

或者,你可以使用 comm 命令将公共元素存储到新数组中。以下是一个示例:

## 定义两个数组
array1=(apple banana cherry)
array2=(banana cherry orange)

## 将数组转换为临时文件
tmp1=$(mktemp)
tmp2=$(mktemp)
printf '%s\n' "${array1[@]}" > "$tmp1"
printf '%s\n' "${array2[@]}" > "$tmp2"

## 查找并将公共元素存储到新数组中
common_elements=($(comm -12 "$tmp1" "$tmp2"))

echo "Common elements: ${common_elements[@]}"
## 输出:Common elements: banana cherry

## 清理临时文件
rm "$tmp1" "$tmp2"

在这个示例中,我们首先使用 mktempprintf 命令将数组转换为临时文件。然后,我们使用带有 -12 选项的 comm 命令来查找两个文件之间的公共元素,并将结果存储在 common_elements 数组中。

通过使用这些技术,你可以轻松地将多个数组之间的公共元素存储到一个新数组中,该数组可在你的 shell 脚本中用于各种目的。

总结

通过遵循本教程中概述的步骤,你将学习如何使用 Shell 编程有效地识别和提取多个数组中的公共元素,并将它们存储在一个新数组中。这些知识将使你能够简化你的 Shell 脚本并增强其功能。