是否有 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
:
由 处理的一组换行符分隔的字符串
sort -u
。关联数组中的键集(自版本 4.0 起)。
bash
实际上,Java 并不是一种具有与 Java 相同通用性的编程语言,因此您必须跳过相当多的环节才能用它进行任何类型的常规编程,特别是如果您需要比基本数组更奇特的数据结构。
中的数组和关联数组bash
是 POSIX shell 标准的扩展。 POSIX shell 只有一个数组 ( $@
),并且没有关联数组。