在 bash shell 中设置等效的数据结构?

在 bash shell 中设置等效的数据结构?

是否有 bash 脚本的数据结构可以类似于java.util.Set会被使用吗?基本上,即使您向其中添加重复元素,也不允许您添加两个相同元素的集合?

我不想存储任何复杂的东西,只是存储一组字符串。

另外,如果它确实存在,它是否需要特定版本的 bash 或者它只是一个 POSIX 兼容的东西?

我知道 bash 确实有数组,并且某些版本的 bash 有哈希图(但不是所有版本)。

答案1

如果您只关心一组字符串,则可以使用关联数组(“哈希图”):

declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello]}" ] ; then ... ; fi

您所关心的只是是否有与密钥相关的东西。该值并不重要,我们只关心那里有一个非空字符串(因此您可以通过将其设置为空字符串来“删除”条目)。

这类似于使用 aHashMap<String,Object>来表示集合(实际上是Java 的 HashSet 是做什么的, 实际上)。

这些关联数组在 Bash 4 及更高版本以及 zsh 和 ksh 中可用。它们不适用于 3 系列 Bash 版本及更早版本,包括 macOS 的 Bash 3.2。


没有 POSIX 等效项。可以模拟一下效果使用eval如果你的字符串受到适当的限制,或者有一个有效的变量名称的自然转换:

hm_hello=1
hm_world=1
key=test
eval "hm_$key=1"
if [ "$(eval hm_$key)" ] ; then ... ; fi

您还可以使用临时文件grep例如,甚至大量临时文件和文件系统作为密钥存储。


也有可能(也许有可能)使用其他一些工具或语言比 shell 脚本更合适。最低限度,awk适用于所有 POSIX 系统它确实支持字符串键关联数组。

如果您确实有复杂的数据结构需求,那么传统的通用语言可能更合适。 Perl 和 Python 也被广泛使用。

答案2

类似于 中的一组字符串的东西bash

  1. 由 处理的一组换行符分隔的字符串sort -u

  2. 关联数组中的键集(自版本 4.0 起)。

bash实际上,Java 并不是一种具有与 Java 相同通用性的编程语言,因此您必须跳过相当多的环节才能用它进行任何类型的常规编程,特别是如果您需要比基本数组更奇特的数据结构。

中的数组和关联数组bash是 POSIX shell 标准的扩展。 POSIX shell 只有一个数组 ( $@),并且没有关联数组。

相关内容