脚本变量未按预期打印


0

为了调试脚本,我正在打印包含文本的变量,这是非常标准的东西,只是变量的行为不符合预期。我发现我正在读取的文件的其中一行少于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  

您是否要进行空间填充?
拉宾

好吧,我想最终是的。我想添加空格以使原始变量更长。这样一来,以后我在脚本中使用:'SpItem = $(echo“ $ STR” | cut -c1-17)''SpItem =“ $ {SpItem ## *()}”''时,它将剪切该项目正确并正确删除尾部空格。
安迪·肯德尔

Answers:


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

我已经在脚本的前面设置了IFS =“,”。
安迪·肯德尔

我尝试将其设置为IFS =“%”,并且没有区别。输出是相同的。如果我在独立脚本中创建以上代码,则它可以按预期工作,因此原始脚本一定会在某种程度上影响它。我应该发布整个东西吗?
安迪·肯德尔

如果您对STR =“ Fan Tray”进行硬编码会怎样?
2014年

如果我对STR =“ Fan Tray”进行硬编码,那么它将起作用:风扇托盘末端8风扇托盘。。26日
安迪·肯德尔

我确实想知道正在读取的行是否包含不可打印的字符,例如Carraige Return,但是我使用了cat -vet文件名,并且该行与所有其他行相同,只是短得多,并以^ M $结尾。
安迪·肯德尔

0

EUREEKA!

该变量的末尾包含^ M Carraige Return字符,因此在该变量上添加空格表示执行Carraige Return之后,在打印了“ Fan Tray”字样后将打印空格,从而覆盖了“ Fan Tray”字样但可变长度正确无误。我添加空格和BINGO 之前脱掉了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  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.