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)。
那为什么^M
?嗯,回车是一个不可打印的字符。它没有可打印的表示。为方便起见,您的终端会将其显示为^M
*. 那么为什么在你出现的时候没有出现echo $values
呢?不幸的是,命令行参数处理将其剥离,因此您看不到它。
同样为了您的方便,您的终端允许您通过 Ctrl+V 和 Ctrl + 某个字母键入不可打印的字符。Ctrl+V 和 Ctrl+M 将产生一个^M
字符,但是左右移动光标,您会看到它作为单个字符跳过整个内容 -与键入^
后跟M
. 当您看到^M
时,命令行程序只能看到原始数据,并且会看到一个实际的回车符。
为什么 5E 4d 0a,即 ^M,ASCII 中的第 13 个字符?
您hexdump
在 的输出上运行echo "^M"
,它产生三个字符: a ^
、 aM
和换行符 (LF)。见上文,这和回车不一样!
为什么结尾符号 0a 显示为 .?. 12 月是 2E。十六进制数 5E 在 DEC 中是 94,在 DEC 中 4d 是 77。
Hexdump 将所有不可打印的字符显示为.
字符,包括回车符和换行符。
*为什么是M?惯例是将 64 添加到 ASCII 代码中。回车是 ASCII 码 13 (0x0D)。添加 64 得到 77 (0x4D),这是一个大写的 M。请参阅此页面以获取完整列表。