带有特殊字符的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
。