Unix和Windows有不同的行结束格式。在Unix世界中,行以换行符(LF,ascii char 10)结尾。 Windows用一个回车符(CR,ascii char 13)跟着一个换行符结束行。
带有Windows行结束符的文件必须先转换为Unix格式,然后才能使用Unix工具。否则像bc
这样的程序会将CR字符视为垃圾和投诉,就像你的情况一样。要将文件转换为Unix格式,可以使用dos2unix(1)
(如果已安装它),或者通过sed 's/^M//g'
(但不要键入文字^ M - 按Ctrl + V,然后按Ctrl + M)交替传递它,可以使用dos2unix(1)
。
那么为什么^M
?那么,回车是一个nonprintable character。它没有可打印的表示。为方便起见,您的终端将显示为^M
*。那么为什么你没有看到echo $values
?不幸的是,命令行参数处理会将其删除,所以您不会看到它。
同样为了您的方便,您的终端允许您通过Ctrl + V和Ctrl +一些字母类型非打印字符。 Ctrl + V和Ctrl + M将产生一个^M
字符,但左右移动光标,您将看到它跳过整个事物作为单个字符 - 不是与输入^
后跟M
相同。虽然你看到^M
,命令行程序只看到原始数据,并会看到一个实际的回车符。
为什么5E 4d 0a,即^ M,第13个字符是ASCII?一个^
,一个M
,和换行字符(LF):
您上的echo "^M"
输出,它产生三个字符跑hexdump
。见上面,这与回车不一样!
为什么结尾符号0a显示为? 。在DEC中是2E。 DEC中的十六进制数5E为94,DEC中的4d为77。
Hexdump显示所有不可打印的字符为.
字符,包括回车符和换行字符。
*为什么选择M?约定是将ASCII码加64。回车符是ASCII码13(0x0D)。加64,你得到77(0x4D),这是一个大写字母M.完整列表见this page。
来源
2010-04-17 15:43:20
rjh
您可以使用'echo -n'来防止echo在其输出结尾添加换行符,但在我的机器上这个例子工作得很好,所以这不是问题。请粘贴'echo“scale = 20; $ values [1] - $ values [2]”|的输出hexdump -C'和'echo -n“scale = 20; $ values [1] - $ values [2]”| hexdump -C'在这里。 – ZyX 2010-04-17 17:45:19
'^ M'不是第13个字符,它只是其可打印的表示。 ''hexdump -C'输出中的'。'表示一个点和任何不可打印的字符。 – ZyX 2010-04-17 23:36:17
@ZyX我希望评论等被合并成一些答案,试图总结一些事情,使这个线程更具可读性。 – hhh 2012-09-19 17:36:01