Define estrutura de dados equivalente no shell bash?

1

Existe uma estrutura de dados para scripts bash que pode ser usada de forma semelhante a algo como um java.util.Set seria usado? Basicamente, uma coleção que, mesmo se você adicionar um elemento duplicado, não permitirá que você adicione dois elementos iguais?

Não estou procurando armazenar nada complicado, apenas um conjunto de strings.

Além disso, se ele existe, ele requer uma versão específica do bash ou é apenas uma coisa compatível com POSIX?

Estou ciente de que o bash tem arrays e algumas versões do bash possuem hashmaps (mas não todas as versões).

    
por leeand00 14.04.2018 / 08:16

2 respostas

1

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.

    
por 14.04.2018 / 08:56
0

Coisas que funcionam como um conjunto de sequências em bash :

  1. Um conjunto de sequências delimitadas por novas linhas processadas por sort -u .

  2. 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 de Java, então você teria que passar por cima do número de aros para fazer qualquer tipo de programação geral, especialmente se você precisar de estruturas de dados mais extravagantes do que matriz básica.

As matrizes e matrizes associativas em bash são extensões para o padrão de shell POSIX. Um shell POSIX tem exatamente um array ( $@ ) e nenhum array associativo.

    
por 14.04.2018 / 08:56