lee*_*d00 9 bash shell-script language
是否有用于 bash 脚本的数据结构,可以使用类似于java.util.Set 之类的东西的使用方式?基本上是一个集合,即使您向其中添加重复元素,也不允许您添加两个相同的元素?
我不想存储任何复杂的东西,只是一组字符串。
另外,如果它确实存在,它是否需要特定版本的 bash 或者它只是一个符合 POSIX 的东西?
我知道 bash 确实有数组,并且某些版本的 bash 有哈希图(但不是所有版本)。
如果您只关心一组字符串,则可以使用关联数组(“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 也被广泛使用。