2010-04-17 124 views
0

我得到了某种格式 - 我无法理解的问题,下面是使用Zsh的简短示例。为什么?为什么错误“非法字符:^ M”?

$ values=(300 400) 
$ echo "scale=20; $values[1]-$values[2]" | bc 
(standard_in) 1: illegal character: ^M   // Why does it not print -100? 
$ echo $values         // no ^M sign found! 
300 400 

助手问题

  1. 为什么5E 4d 0a,即^M,在ASCII字符13日?
  2. 为什么结尾符号“0a”显示为点“。”? “。”在Hex中是“2E”。
+1

您可以使用'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

+0

'^ M'不是第13个字符,它只是其可打印的表示。 ''hexdump -C'输出中的'。'表示一个点和任何不可打印的字符。 – ZyX 2010-04-17 23:36:17

+0

@ZyX我希望评论等被合并成一些答案,试图总结一些事情,使这个线程更具可读性。 – hhh 2012-09-19 17:36:01

回答

8

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

+0

' M'产生'M',而不是'^ M'。 '^ M'由''产生。 – ZyX 2010-04-17 23:40:04

0

^M在一个字符中 - 回车符是dos/windows或ASCII 13字符。看来,不知怎的,你妥协了你的输入,也许通过粘贴东西从Windows文件或类似的东西...

0

如果你运行你的文件通过dos2unix,如果该程序可用在您的系统上可能会更好。

其中,dos2unix将Windows \ r \ n行结尾转换为Unix风格\ n行结尾。

0

答案助手问题

I.为什么5E 4D 0A,即^ M,在ASCII字符13日?

换行符是0a,请参见下面的ZyX提供的示例。 rjh澄清了关于第13个字符的东西。 echo -n可防止回声在其输出”“末尾添加换行符。我正在使用Debian。

$ echo "scale=20; $values[1]-$values[2]" | hexdump -C 
00000000 73 63 61 6c 65 3d 32 30 3b 20 5b 31 5d 2d 5b 32 |scale=20; [1]-[2| 
00000010 5d 0a            |].| 
00000012 
[email protected]:~$ echo -n "scale=20; $values[1]-$values[2]" | hexdump -C 
00000000 73 63 61 6c 65 3d 32 30 3b 20 5b 31 5d 2d 5b 32 |scale=20; [1]-[2| 
00000010 5d            |]| 
00000011 

II。为什么结尾符号“0a”显示为点“。”? “。”在Hex中是“2E”。

TODO:有人回答这个问题了吗?请评论,回答或编辑。

信息,帮助例子

ASCII以HEX

`.` is `2E` in Hex 
`5E` is `^` in Hex 
`4d` is `M` in Hex 

十六进制ASCII码:使用该看什么六角-things意思

$ echo "^M" | hexdump -C 
00000000 5e 4d 0a           |^M.| 
00000003 
$ ascii -x    
    0 NUL 10 DLE 20  30 0 40 @ 50 P 60 ` 70 p 
    1 SOH 11 DC1 21 ! 31 1 41 A 51 Q 61 a 71 q 
    2 STX 12 DC2 22 " 32 2 42 B 52 R 62 b 72 r 
    3 ETX 13 DC3 23 # 33 3 43 C 53 S 63 c 73 s 
    4 EOT 14 DC4 24 $ 34 4 44 D 54 T 64 d 74 t 
    5 ENQ 15 NAK 25 % 35 5 45 E 55 U 65 e 75 u 
    6 ACK 16 SYN 26 & 36 6 46 F 56 V 66 f 76 v 
    7 BEL 17 ETB 27 ' 37 7 47 G 57 W 67 g 77 w 
    8 BS  18 CAN 28 ( 38 8 48 H 58 X 68 h 78 x 
    9 HT  19 EM  29) 39 9 49 I 59 Y 69 i 79 y 
    A LF  1A SUB 2A * 3A : 4A J 5A Z 6A j 7A z 
    B VT  1B ESC 2B + 3B ; 4B K 5B [ 6B k 7B { 
    C FF  1C FS  2C , 3C < 4C L 5C \ 6C l 7C | 
    D CR  1D GS  2D - 3D = 4D M 5D ] 6D m 7D } 
    E SO  1E RS  2E . 3E > 4E N 5E^ 6E n 7E ~ 
    F SI  1F US  2F/ 3F ? 4F O 5F _ 6F o 7F DEL 
相关问题