带有特殊字符的Linux cat内联文件

带有特殊字符的Linux cat内联文件,linux,cat,Linux,Cat,我有以下脚本: #!/bin/bash cat << EOF A^@B^AC^B EOF 我的问题是为什么?我希望有这样的输出: 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.A.B.C..E 00000020: 4f46 0a

我有以下脚本:

#!/bin/bash
cat << EOF
A^@B^AC^B
EOF
我的问题是为什么?我希望有这样的输出:

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.A.B.C..E
00000020: 4f46 0a                                  OF.
#!/bin/bash
cat <<"EOF"
A^@B^AC^B
EOF

字符“A”,后跟十进制值0,后跟“B”,后跟十进制值1,后跟“C”,后跟十进制值2。

原因似乎有两个方面

首先,请注意,您必须在中引用单词/分隔符,以避免扩展

如果word不带引号,则here文档的所有行都将进行参数扩展、命令替换和算术扩展,忽略字符序列\换行符,并且必须使用“\”来引用字符“\”、“$”和“`”

所以,如果你这样写:

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.A.B.C..E
00000020: 4f46 0a                                  OF.
#!/bin/bash
cat <<"EOF"
A^@B^AC^B
EOF
#/bin/bash

cat在详细考虑了这个问题之后,我意识到引用单词/分隔符(正如另一个答案所建议的)不应该影响脚本的输出(我的脚本中没有执行参数扩展、命令替换和算术扩展)

因此,
\000
确实消失了,因为您不能在变量或命令行的参数中使用空字符

但是,
\001
由于bash错误而消失。bash在内部将该值用作转义字符。错误发生在函数
expand\u word\u internal
中,该函数不能正确处理转义字符(请参阅错误报告)


bash-devel分支中已经修复了该错误。

谢谢,我想我必须使用
echo-e
而不是
cat
来包含空字符。您还可以(可能更好)使用
printf
(例如
printf'\0\01\xCA\xFE'\124; hd
)。如果使用
echo
,请确保同时添加
-n