一种选择是查看您尝试使用十六进制查看器或编辑器的字符。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
,。0x5D
0x20
这些值是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}