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