Existe uma estrutura de dados para scripts bash que pode ser usada de forma semelhante a como algo como um java.util.Set seria usado? Basicamente, uma coleção que mesmo se você adicionar um elemento duplicado a ela não permitirá que você adicione dois do mesmo elemento?
Não pretendo armazenar nada complicado, apenas um conjunto de strings.
Além disso, se existir, requer uma versão específica do bash ou é apenas uma coisa compatível com POSIX?
Estou ciente de que o bash possui arrays e algumas versões do bash possuem hashmaps (mas não todas as versões).
Se tudo o que importa é um conjunto de strings, basta usar um array associativo ("hashmap"):
Tudo o que importa é se há algo associado à chave ou não. O valor não importa, nós apenas nos importamos que haja uma string não vazia lá (para que você possa "excluir" uma entrada definindo-a como uma string vazia).
Isso seria análogo ao uso de a
HashMap<String,Object>
para representar um conjunto (que na verdade é o que o HashSet de Java faz ).Essas matrizes associativas estão disponíveis no Bash 4 e posterior e também em zsh e ksh. Eles não funcionam nas versões Bash da série 3 e anteriores, incluindo o Bash 3.2 do macOS.
Não há equivalente POSIX. Você pode simular o efeito usando
eval
se suas strings são adequadamente restritas ou têm uma transformação natural para nomes de variáveis válidos:Você também pode usar um arquivo temporário e
grep
, por exemplo, ou mesmo muitos arquivos temporários e o sistema de arquivos como um armazenamento de chaves.Também é possível (talvez provável) que o uso de alguma outra ferramenta ou linguagem seja mais adequado do que o script de shell. No mínimo,
awk
está disponível em todos os sistemas POSIX e suporta matrizes associativas com chave de string.Se você realmente tem necessidades complexas de estrutura de dados, uma linguagem convencional de uso geral pode ser ainda mais apropriada. Perl e Python também estão amplamente disponíveis.
Coisas que agem como um conjunto de strings em
bash
:Um conjunto de strings delimitadas por nova linha processadas por
sort -u
.O conjunto de chaves em um array associativo (desde a versão 4.0).
bash
não é realmente uma linguagem de programação com a mesma generalidade que Java, então você teria que passar por um grande número de aros para fazer qualquer tipo de programação geral nela, especialmente se você precisar de estruturas de dados mais sofisticadas do que uma matriz básica.Os arrays e arrays associativos
bash
são extensões do padrão shell POSIX. Um shell POSIX tem exatamente um array ($@
) e nenhum array associativo.