В попытке отладить скрипт, я печатаю переменные, содержащие текст, довольно стандартные вещи, за исключением того, что переменные ведут себя не так, как ожидается. Я обнаружил, что одна из строк файла, который я читаю, имеет длину менее 17 символов, что еще больше запутывает скрипт, поэтому я тестирую менее 17 и пытаюсь добавить 18 пробелов , Что происходит, так это то, что пробелы добавляются в начало переменной и перезаписывают буквы там, а не в конце, где я ожидаю их добавления. Расчет длины показывает правильно на 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  

читает в строке "Fan Tray(8 мест)", получая:

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

Я ожидаю, что это покажет:

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

2 ответа2

0

Попробуйте изменить 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

После запуска вывод был

Fan Tray         
.                .
end
17
Fan Tray         .                .
35
0

EUREEKA!

Переменная включала символ ^ M Carraige Return на своем конце, поэтому добавление пробелов означало, что она будет печатать пробелы после выполнения Carraige Return, после того как она напечатала слова "Fan Tray", перезаписав таким образом слова "Fan Tray". но оставляя переменную длину правильной. Я снял с Carraige Return, прежде чем добавить пробелы и БИНГО! Таким образом:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .