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
bash-scripting
Andy Kendall
źródło
źródło
Odpowiedzi:
Spróbuj zmienić IFS.
Po uruchomieniu wyjście było
źródło
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:
źródło