我有以下脚本:
#!/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.
当我运行脚本时,小数值0和1似乎消失了:
./main.sh | xxd
00000000: 4142 4302 0a ABC..
我的问题是为什么?我期待有这样的输出:
字符'A',后跟十进制值0,后跟'B',后跟十进制值1,后跟'C',后跟十进制值2.
答案 0 :(得分:2)
原因似乎是双重的。
首先,请注意,您必须引用here-document 中的 /分隔符,以避免扩展:
如果 word 不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,忽略字符序列\ newline,并且必须使用'\'引用字符'\','$'和'`'。
所以,如果你这样写:
#!/bin/bash
cat <<"EOF"
A^@B^AC^B
EOF
您将保留除NULL(\0
)以外的所有字符。
但是你不能在任何变量或命令行的参数中使用NULL char(参见this answer)。
您可以在管道/文件中使用 NULL,因此您可能希望对here-document的内容进行编码并在运行时对其进行解码(例如使用xxd
)。< / p>
答案 1 :(得分:0)
在仔细考虑了这个问题后,我意识到引用单词/分隔符(正如另一个答案所建议的)不应该影响脚本的输出(参数扩展,命令替换和算术扩展都没有在我的执行中执行脚本)。
所以,\000
确实消失了,因为你不能在任何变量或命令行的参数中使用NULL字符。
但是,由于bash bug,\001
消失了。该值在bash内部用作转义字符。错误发生在函数expand_word_internal
中,它无法正确处理该转义字符(请参阅错误报告here)。
该错误已在bash devel分支中修复。