具有特殊字符的Linux猫内联文件

我有以下脚本:

#!/bin/bash cat << EOF A^@B^AC^B EOF 

哪里:

  • '^ @'=十进制值0
  • '^ A'=十进制值1
  • '^ B'=十进制值2

所以,这个文件看起来像这样:

 xxd main.sh 00000000: 2321 2f62 696e 2f62 6173 680a 0a63 6174 #!/bin/bash..cat 00000010: 203c 3c20 454f 460a 4100 4201 4302 0a45 << EOF.ABC.E 00000020: 4f46 0a OF. 

当我运行脚本时,十进制值0和1似乎消失:

 ./main.sh | xxd 00000000: 4142 4302 0a ABC.. 

我的问题是为什么? 我期待有这样的输出:

字符'A',后面是十进制值0,后面是'B',后面是十进制值1,后面是'C',后面是十进制值2。

原因似乎是双重的。

首先,请注意,您必须引用 here-document中的/分隔符以避免扩展

如果单词不加引号,则这里的文档的所有行都经过参数扩展,命令替换和算术扩展,忽略字符序列\换行符,并且必须使用'\'来引用字符'\','$ '和'`'。

所以,如果你这样写:

 #!/bin/bash cat <<"EOF" A^@B^AC^B EOF 

您将保留除NULL( \0 )以外的所有字符。

但是你不能在任何变量或者命令行参数中使用NULL char(见这个答案 )。

可以在管道/文件中使用 NULL,所以你可能想对你的here-document的内容进行编码,并在飞行中对它进行解码(例如使用xxd )。