我有以下脚本:
#!/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.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
)。