BASH: Array as String Buffer

3

Em vez de exibir (ou gravar) todos os resultados gerados, criei um Array baseado Buffer para armazenar dados e escrevê-los sempre que o contador de linha atingir um valor MAX. Aqui está o script:

#!/bin/bash
#Buffer Management
BUFFERCURSOR=0
BUFFERMAXSIZE=5
function bufferReset (){
    unset BUFFERVAR
    BUFFERCURSOR=0
}
function bufferAppend () {
    (( BUFFERCURSOR++ ))
    BUFFERVAR[$BUFFERCURSOR]="$1"
}
function bufferDisplay () {
    for ((i=1;i<=$BUFFERCURSOR;i++)); do printf "%s\n" "${BUFFERVAR[$i]}" ; done
}
#Buffer Management End:
for ((i=1;i<=8;i++)) ; do
    line='printf "%3s" "$i ==> $(echo $i | md5sum|awk '{print $1}')"' #Example of a string to append
    bufferAppend "$line"
    if [ "$BUFFERCURSOR" == "$BUFFERMAXSIZE" ] ;    then
        bufferDisplay
        bufferReset
    fi
done
# Display remaining elements in the "buffer"
bufferDisplay
bufferReset

Então a saída é:

1 ==> b026324c6904b2a9cb4b88d6d61c81d1
2 ==> 26ab0db90d72e28ad0ba1e22ee510510
3 ==> 6d7fce9fee471194aa8b5b6e47267f03
4 ==> 48a24b70a0b376535542b996af517398
5 ==> 1dcca23355272056f04fe8bf20edfce0
7 ==> 84bc3da1b3e33a18e8d5e1bdd7a18d7a
8 ==> c30f7472766d25af1dc80b3ffc9a58c7

Por que o 6º elemento é ignorado?

    
por Slyx 04.02.2014 / 03:53

1 resposta

6

O problema pode ser visto facilmente iniciando o script como

bash -vx ./script

Você usa a mesma variável no programa principal e em uma função que é realmente uma má ideia. bufferDisplay deixa i no valor 6 após o qual o i++ do loop principal é executado.

A melhor maneira de evitar isso é usar um espaço de nome separado em todas as funções. Cada variável em uma função que não é intencionalmente aquela do espaço de nome externo deve ser declarada como

local i

Você também pode usar nomes diferentes; especialmente com um pequeno propograma. Mas a abordagem local é menos propensa a erros.

    
por 04.02.2014 / 04:19