一种选择是查看您尝试使用十六进制查看器或编辑器的字符。hexdump如果您仅限于航站楼,这是一个不错的选择。
$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000  5b 20 2d 66 20 2f 65 74  63 2f 6f 70 65 6e 76 70  |[ -f /etc/openvp|
00000010  6e 2f 63 6c 69 65 6e 74  2e 63 6f 6e 66 20 5d 20  |n/client.conf ] |
00000020  26 26 20 65 63 68 6f 20  74 72 75 65 0a           |&& echo true.|
0000002d
你可以在这里看到space,close-square-brace,space是正确的- ,0x20,。0x5D0x20
这些值是ASCII码,以十六进制显示。超出范围的任何值0x20- 0x7E就ASCII而言,不是“ 可打印字符 ”,并且很可能不能与命令行界面一起使用。
注意:我复制了您在上面示例中使用的第一个“ 损坏 ”行hexdump,因此在原始源和渲染问题之间使用ASCII空格替换了非 ASCII空格。
要重复此操作,请执行以下步骤:
- 输入
hexdump -Cv <<"EOF"并按Enter 
- 粘贴您要使用的文本
 
- 键入
EOF自己的一行,然后按Enter 
终端和命令行界面不能很好地处理特殊字符 - 正如您所发现的那样。如果您对格式化文档不是很小心,那么使用“ 智能引号 ”,em-dashes,Microsoft Word(和其他人)也会遇到问题,列表继续...
发现差异:(顶部是“ 智能引号 ”,底部是“ 直引号 ”)

$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000  e2 80 9c 71 75 6f 74 65  64 20 73 74 72 69 6e 67  |...quoted string|
00000010  e2 80 9d 0a                                       |....|
00000014
在这里,打开引号不是一个简单的ASCII引号("),但有一个Unicode / UTF-8系列- ,0xE2,0x80,0x9C或U+201C-该终端将不处理,因为你所期望的。
Kiwy的建议cat -A也做了这个工作:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
注意:使用时echo "..." | hd,bash可能会替换您要检查的部分字符串。在尝试检查脚本的组件时,这尤其令人担忧。
例如尝试:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
这些方法正在用相关文本替换组件。为避免这种情况,请使用以下方法之一。注意使用单引号(')和“ 引用的heredoc ”("EOF")。
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}