Eine Möglichkeit besteht darin, sich die Zeichen anzusehen, die Sie mit einem Hex-Viewer oder -Editor verwenden möchten. hexdump
ist eine gute Option, wenn Sie auf das Terminal beschränkt sind.
$ 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
Sie können hier sehen, dass die space
, close-square-brace
, space
korrekt sind - 0x20
, 0x5D
, 0x20
.
Diese Werte sind ASCII-Codes und werden hexadezimal angezeigt . Jeder Wert außerhalb des Bereichs 0x20
- 0x7E
ist für ASCII kein " druckbares Zeichen " und kann mit Befehlszeilenschnittstellen höchstwahrscheinlich nicht gut funktionieren.
Hinweis: Ich habe Ihre erste " unterbrochene " Zeile für die Verwendung im hexdump
obigen Beispiel kopiert, sodass etwas den Nicht-an-ASCII-Bereich durch einen ASCII-Bereich zwischen der ursprünglichen Quelle und Ihrer gerenderten Frage ersetzt hat.
Führen Sie die folgenden Schritte aus, um dies zu wiederholen:
- Geben Sie ein
hexdump -Cv <<"EOF"
und drücken SieEnter - Fügen Sie den gewünschten Text ein
- Geben Sie
EOF
in eine eigene Zeile ein und drücken SieEnter
Terminals und Befehlszeilenschnittstellen behandeln Sonderzeichen nicht gut - wie Sie festgestellt haben. Wenn Sie beim Formatieren von Dokumenten nicht besonders vorsichtig sind, werden Sie auch Probleme mit Microsoft Word (und anderen) haben, wenn Sie " intelligente Anführungszeichen " verwenden, Bindestriche, die Liste wird fortgesetzt ...
Finde den Unterschied: (oben ist " intelligente Anführungszeichen ", unten sind " gerade Anführungszeichen ")
$ 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
Hier sind die offenen Angebote sind keine einfache ASCII - Zitat ( "
), aber sind eine Unicode / UTF-8 - Serie - 0xE2
, 0x80
, 0x9C
oder U+201C
- was das Terminal nicht behandeln, wie man erwarten könnte.
Kiwys Vorschlag von cat -A
macht auch die Arbeit:
$ cat -A <<"EOF" > “quoted string” > EOF M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Hinweis: Bei der Verwendungecho "..." | hd
haben Sie die Möglichkeit, dass bash Teile der Zeichenfolge ersetzt, die Sie untersuchen möchten. Dies ist besonders problematisch, wenn Sie versuchen, die Komponenten eines Skripts zu überprüfen.
Zum Beispiel versuchen Sie:
$ echo "$" attie $ echo "`whoami`" attie $ echo "$(whoami)" attie $ cat <<EOF > $ > EOF attie
Diese Methoden ersetzen Komponenten durch den entsprechenden Text. Um dies zu vermeiden, verwenden Sie einen der folgenden Ansätze. Beachten Sie die Verwendung von einfachen Anführungszeichen ( '
) und einem " quoted heredoc " ( "EOF"
).
$ echo '$' $ $ echo '`whoami`' `whoami` $ echo '$(whoami)' $(whoami) $ cat <<"EOF" > $ > EOF $