Saída de eco resulta em ordem errática no BASH

1

Palavra de aviso: Sou relativamente novo no scripting BASH, por isso qualquer conselho sobre o meu script hacky é apreciado.

Eu tenho um problema estranho, no meu código eu coletei um monte de strings de erro de um arquivo em um array, e um segundo array armazena a contagem dos erros no mesmo índice (eu fiz isso dada a falta de Arrays 2D, e realmente não queriam abordar a construção de uma matriz).

Ao enviar o código, eu uso esta linha:

for ((i=0; i<${#NAME_ARRAY[@]}; i++)); do
   echo "Error: ${NAME_ARRAY[$i]} x ${COUNT_ARRAY[$i]}"
done

Neste caso estou testando com dois arquivos separados, se eu rodar no arquivo um eu recebo esta saída:

Error: Exception: unknown/unregistered file format : x 72982

Isso é legal, funciona bem e exatamente como esperado. Eu sei que há apenas um erro ("Exceção: desconhecido / formato de arquivo não registrado:") no arquivo de log enorme, e que aparece 72982 vezes.

Mas no meu outro caso, recebo este resultado:

x 66964xception: Some kind of disk I/O error occurred

Aqui é onde eu estou completamente perdido. Se eu imprimir $ {NAME_ARRAY [$ i]} individualmente, recebo "Algum tipo de erro de E / S de disco" perfeitamente bem. Da mesma forma, se eu imprimir $ {COUNT_ARRAY [$ i]} eu mesmo obtenho "66964" ... mas quando eu coloco ambos em uma string, o número COUNT_ARRAY é lançado no início da minha string e sobrescreve o "Erro: "parte.

Achando que eu poderia ser um pouco inteligente e muito hacky, decidi fazer isso:

echo -n "Error: ${NAME_ARRAY[$i]}"
echo " x ${COUNT_ARRAY[$i]}"

Minha mente amadora pensou que isso separaria as duas saídas (no caso de qualquer tipo de problema de segmentação / prioridade), mas, infelizmente, ainda obtenho exatamente o mesmo resultado.

Estou sentindo falta de algo extraordinariamente óbvio? Ou os meus ecos estão fazendo algo estranho?

Eu também testei apenas usando printf em vez de echo e a mesma coisa acontece. Poderia haver algum tipo de problema de codificação de caracteres que está se acumulando ao imprimir no console?

    
por Paul 16.09.2015 / 01:18

1 resposta

4

É muito provável que a mensagem "Algum tipo de erro de E / S de disco" contenha um caractere \r no final. Isso redefine o cursor para o início da linha atual, fazendo com que o "x 66964", que é a saída ao lado, sobrescreva o início da linha. Para corrigi-lo, você precisa remover o retorno de carro quando o ler em $ NAME_ARRAY, por exemplo, passando por tr -d '\r' .

    
por 16.09.2015 / 01:35