最近写一个较长的shell脚本为了方便在notepad++上编辑的,之后上传Linux服务器,执行时发现输出内容并非预期结果,其中有片段如下:
yester=`date -d "yesterday" +%Y%m%d`
myhour=$yester"12"
echo $myhour
预期结果应输出2017092312
但实际输出为12170923
可以看到最后两个字符串“12”与前边两个字符串叠加替换掉输出了
测试几次之后把这段直接在Linux命令行编写执行,结果是没有问题的,这下可以证明是编辑器编写文本的问题了,于是实验之后证明:
文本编辑器编写的shell中包含有\r或者 字符,这其实是主要Windows系统与Linux换行的区分,使用编辑器替换字符的功能替换\r为空字符,再上传服务器测试成功,也可以使用 tr -d '\r' 命令替换掉 特殊字符,或者直接在Linux上vim编辑此shell。
总结:在echo整体输出或不换行输出时,如果输出变量字符串中含有\r或
的特殊字符,则有可能导致在其后续输出变量内容会从首字符重新开始重叠输出,就导致显示结果上的怪模怪样了。
初步解释,echo在这个场景下的行为也是很符合设计的。原则上在echo不换行输出模式下,输出字符串中要求换行,则echo控制流只能让输出流重新回到了当前行的首字符,相当于一次软回车,这样就出现了覆写、覆盖了!
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!