Zmienne skryptowe nie są drukowane zgodnie z oczekiwaniami

0

Próbując debugować skrypt, wypisuję zmienne zawierające tekst, całkiem standardowe rzeczy, z wyjątkiem tego, że zmienne nie zachowują się zgodnie z oczekiwaniami. Odkryłem, że jeden z wierszy pliku, który czytam, ma mniej niż 17 znaków, co psuje skrypt, więc testuję mniej niż 17 znaków i próbuję dodać 18 spacji . Dzieje się tak, że spacje są dodawane na początku zmiennej i nadpisują tam litery, a nie na końcu, gdzie spodziewam się, że zostaną dodane. Obliczenie długości pokazuje jednak poprawnie przy 35.

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  

czyta w wierszu „Fan Tray (8 spacji)”, tworząc:

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

Spodziewam się, że pokaże:

Fan Tray  
end  
17  
Fan Tray.                . <<< 18 spaces in here  
35  
Andy Kendall
źródło
próbujesz zrobić padding?
Rabin
Cóż, przypuszczam, że ostatecznie tak. Chcę dodać spacje, aby pierwotna zmienna była dłuższa. Jest tak, że później w skrypcie, gdy użyję: „SpItem = $ (echo„ $ STR ”| cut -c1-17)” „SpItem =" $ {SpItem ## * ()} "'spowoduje wycięcie elementu poprawnie i poprawnie usuń spacje.
Andy Kendall,

Odpowiedzi:

0

Spróbuj zmienić 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

Po uruchomieniu wyjście było

Fan Tray         
.                .
end
17
Fan Tray         .                .
35
w zasadzie
źródło
Mam już IFS = "," ustawiony wcześniej w skrypcie.
Andy Kendall,
Próbowałem ustawić na IFS = "%" i to nie robi różnicy. Dane wyjściowe są takie same. Jeśli utworzę powyższe w samodzielnym skrypcie, działa zgodnie z oczekiwaniami, więc oryginalny skrypt musi w jakiś sposób wpływać na to. Czy powinienem opublikować całość?
Andy Kendall,
Co się stanie, jeśli użyjesz twardego kodu STR = „Fan Tray”?
głównie
Jeśli I hardcode STR = „Fan Tray” to działa: Fan Tray end 8 Fan Tray. . 26
Andy Kendall
Zastanawiałem się, czy czytana linia zawiera znak, który nie może być wydrukowany, na przykład Carraige Return, ale użyłem cat -vet nazwa pliku, a linia jest taka sama jak wszystkie pozostałe, tylko o wiele krótsza i kończy się ^ M $.
Andy Kendall,
0

EUREEKA!

Zmienna zawierała znak ^ M Carraige Return na jej końcu, więc dodanie do niej spacji oznaczało, że będzie drukować spacje po wykonaniu Carraige Return, po wydrukowaniu słów „Fan Tray”, zastępując w ten sposób słowa „Fan Tray” ale pozostawiając poprawną długość zmiennej. Zdjąłem Carraige Return przed dodaniem spacji i BINGO !!. A zatem:

while read line  
do STR=$line  
length=${#STR}  
spaces="                  "  
if [ $length -le 17 ]  
then  
TEMPSTR=$(echo $STR | tr -d '\r')  
STR="$TEMPSTR$spaces"  
fi  
Andy Kendall
źródło