Linux Shell Echo多变量输出时怪异叠写现象(某些字符串变量中含有\r或\n)

今天利用Linux Shell命令从文件中截取一部分文本行信息 `Cat file | grep someKeyword` 到Shell变量中,然后又用shell字符串变量截取的方法,提取文本行内更准确的字符信息;利用同样的操作方法,得到多个字符串变量信息,最后再用echo组合多变量输出所需要的格式信息,但最终控制台显示结果却发现了怪异现象,一些字符没有出现或者从首字符处出现了叠写、相互覆盖、覆写的现象!

例如:用Echo命令多变量组合输出 echo "$var1 $ var2 $ var3",却意外地只看到var3完整内容和var2部分内容,且var3重叠到首字母进行覆盖输出。

调整var1、var2、var3变量的顺序后,会得到一些不同,但是由于调整顺序并不满足最终要求(只能是var1..N的顺序组合;var1和var2都含有同样的特殊字符),在最开始费了好一阵子时间,一直参不透到底是因为什么。

过程中甚至还怀疑到echo -e模式身上上来,初步怀疑到是因为某些特殊字符的原因。不过,这是驴头不对马嘴,完全相反。过程中又猜测用echo -n是不是会效果好点,结果依然出现同样的输出重叠的现象。

 深入研究下去,用Shell字符串长度函数获得var1、var2、var3字符串长度,发现var1、var2的字符串长度与实际看到的字符有差异,且差了一个字符!

当时就怀疑到是不是var1、var2中含有\r或\n的隐藏字符,后来用tr -d '\r'和tr -d '\n'去掉字符串中的特殊\r、\n字符,发现输出就正常了。

由此,总结:在echo整体输出或不换行输出时,如果输出变量字符串中含有\r或\n的特殊字符,则有可能导致在其后续输出变量内容会从首字符重新开始重叠输出,就导致显示结果上的怪模怪样了。

初步解释,echo在这个场景下的行为也是很符合设计的。原则上在echo不换行输出模式下,输出字符串中要求换行,则echo控制流只能让输出流重新回到了当前行的首字符,相当于一次软回车,这样就出现了覆写、覆盖了!

你可能感兴趣的:(小工具)