Se tudo o que importa é um conjunto de strings, basta usar um array associativo ("hashmap"):
declare -A hm
hm[hello]=1
hm[world]=1
hm[hello]=1
if [ "${hm[hello}" ] ; then ... ; fi
Tudo o que importa é se há algo associado à chave ou não. O valor não importa, nós só nos importamos que haja uma string não vazia (assim você pode "deletar" uma entrada configurando-a para uma string vazia).
Isso seria análogo ao uso de HashMap<String,Object>
para representar um conjunto (o que na verdade é o que o HashSet do Java faz , na verdade).
Esses arrays associativos estão disponíveis no Bash 4 e posterior, e também em zsh e ksh. Eles não funcionam nas versões Bash de 3 séries e anteriores, incluindo o Bash 3.2 do macOS.
Não há equivalente POSIX. Você pode simular o efeito usando eval
se suas strings estiverem adequadamente restritas ou se tiver uma transformação natural para nomes de variáveis válidos:
hm_hello=1
hm_world=1
key=test
eval "hm_$key=1"
if [ "$(eval hm_$key)" ] ; then ... ; fi
Você também pode usar um arquivo temporário e grep
, por exemplo, ou até 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 que o shell script. No mínimo, awk
está disponível em todos os sistemas POSIX e oferece suporte a matrizes associativas.
Se você realmente tem necessidades complexas de estrutura de dados, uma linguagem convencional de propósito geral pode ser ainda mais apropriada. Perl e Python também estão amplamente disponíveis.