Variáveis de script que não são impressas conforme o esperado

0

Em uma tentativa de depurar um script, estou imprimindo variáveis contendo texto, bastante padrão, exceto que as variáveis não estão se comportando como esperado. Eu descobri que uma das linhas de um arquivo que eu estou lendo, tem menos de 17 caracteres, bagunçando o script mais adiante, então estou testando por menos de 17 e tentando adicionar 18 espaços . O que acontece é que os espaços estão sendo adicionados ao início da variável e sobrescrevendo as letras lá, não no final onde eu espero que eles sejam adicionados. O cálculo do comprimento mostra corretamente em 35 embora.

do STR=$line  
length=${#STR}  
spaces=".                ." <<<<18 spaces in here  
end=end   
if [ $length -le 17 ]  
then  
TEMPSTR=$STR  
echo $TEMPSTR  
echo $end  
echo $length  
TEMPSTR2="$TEMPSTR$spaces"  
length=${#TEMPSTR2}  
echo $TEMPSTR2  
echo $length  
fi  

está lendo em uma linha "Fan Tray (8 spaces)" produzindo:

Fan Tray  
end  
17  
.                . <<< 18 spaces in here  
35  

Espero que mostre:

Fan Tray  
end  
17  
Fan Tray.                . <<< 18 spaces in here  
35  
    
por Andy Kendall 20.05.2014 / 12:43

2 respostas

0

Tente alterar o IFS.

#!/bin/bash
IFS=%
STR="Fan Tray         "
length=${#STR}
spaces=".                ."
end=end
    if [ $length -le 17 ]
    then
    TEMPSTR=$STR
    echo $TEMPSTR  
    echo $spaces
    echo $end  
    echo $length  
    TEMPSTR2="$TEMPSTR$spaces"
    length=${#TEMPSTR2}
    echo $TEMPSTR2  
    echo $length  
fi
unset IFS

Após a execução, a saída foi

Fan Tray         
.                .
end
17
Fan Tray         .                .
35
    
por 20.05.2014 / 14:10
0

EUREEKA!

A variável estava incluindo o caractere ^ M Carraige Return em seu final, então adicionar espaços a ele significava imprimir os espaços após executar o retorno Carraige, depois de ter impresso as palavras "Fan Tray" ", sobrescrevendo as palavras" Fan Tray ", mas deixando o comprimento variável correto. Eu tirei o retorno Carraige antes adicionando os espaços e BINGO !!. Assim:

while read line  
do STR=$line  
length=${#STR}  
spaces="                  "  
if [ $length -le 17 ]  
then  
TEMPSTR=$(echo $STR | tr -d '\r')  
STR="$TEMPSTR$spaces"  
fi  
    
por 21.05.2014 / 08:46