KSH / BASH Tamanho máximo de uma matriz

4

Qual é o tamanho máximo da matriz para o script ksh e bash?

Exemplo: suponha que eu tenha uma matriz de 10 elementos. Qual será o número máximo de contagens de strings que um determinado índice de uma matriz pode conter? Qual será o tamanho máximo de um array para o mesmo?

Eu sou novo no Unix. Eu imagino que esta é uma pergunta comum, mas eu não consegui encontrar uma resposta, então eu decidi perguntar aqui.

    
por Aman 09.04.2015 / 07:54

3 respostas

12
i=0
while true; do
    a[$i]=foo
    i=$((i+1))
    printf "\r%d " $i
done

Este script simples é exibido nos meus sistemas (Gnu / Linux e Solaris):

  • ksh88 limita o tamanho a 2^12-1 (4095). ( subscript out of range ). Alguns lançamentos mais antigos, como o do HP-UX, limitam o tamanho a 1023 .

  • ksh93 limita o tamanho de uma matriz a 2^22-1 (4194303). Sua milhagem pode variar.

  • bash não procura impor nenhum limite codificado fora do limite determinado pelos recursos de memória subjacentes disponíveis. Por exemplo, o bash usa 1.3 GB da memória virtual para um tamanho de matriz de 18074340 .

Nota: Eu desisti com mksh , que foi muito lento executando o loop (mais de cem vezes mais lento que zsh , ksh93 e bash .)

    
por 09.04.2015 / 09:51
3

Não há limite máximo para o tamanho de um array, nem qualquer requisito de que os membros sejam indexados ou atribuídos de forma contígua. Os arrays indexados são referenciados usando números inteiros (incluindo expressões aritméticas (veja Aritmética Shell)) e são baseados em zero; matrizes associativas usam strings arbitrárias. Salvo indicação em contrário, os índices de matriz indexados devem ser números inteiros não negativos.

link

    
por 09.04.2015 / 08:26
2

Depende da implementação. Em ksh, há "limites definidos pela implementação" documentados para matrizes indexadas . Para ksh88 existem sistemas com um limite de 1023, para ksh93 o limite mínimo requerido por uma implementação é 4095. Então você não pode contar com mais disponibilidade do que isso! (Se você está apenas implementando para um sistema específico, você pode testar seus limites de sistema como proposto em outra resposta aqui.)

    
por 09.04.2015 / 10:05