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

lee*_*d00 9 bash shell-script language

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

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

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

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

Mic*_*mer 7

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

declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello]}" ] ; then ... ; fi
Run Code Online (Sandbox Code Playgroud)

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

这类似于使用 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
Run Code Online (Sandbox Code Playgroud)

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


也有可能(可能)使用其他工具或语言比 shell 脚本更合适。至少,awk在所有 POSIX 系统上都可用,并且它确实支持字符串键关联数组。

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