脚本变量未按预期打印

脚本变量未按预期打印

为了调试脚本,我打印了包含文本的变量,这是相当标准的内容,只是变量的行为不符合预期。我发现我读入的文件中有一行的长度少于 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  

答案1

尝试更改 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

答案2

尤瑞卡!

该变量的末尾包含 ^M 回车符,因此在其后面添加空格意味着它会打印空格在打印出“Fan Tray”字样后执行回车符,从而覆盖“Fan Tray”字样,但变量长度保持不变。我去掉了回车符添加空格和 BINGO!!。因此:

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

相关内容