Sie könnten cat
verwenden mit der -A
Option:aus dem Handbuch:
-A, --show-all
equivalent to -vET
-E, --show-ends
display $ at end of each line
-T, --show-tabs
display TAB characters as ^I
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
Also cat -A yourscrip.sh
wird Ihnen unsichtbare und seltsame Charaktere zeigen.
Eine Möglichkeit besteht darin, sich die Zeichen, die Sie verwenden möchten, mit einem Hex-Viewer oder -Editor anzusehen. 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
richtig sind - 0x20
, 0x5D
, 0x20
.
Diese Werte sind ASCII-Codes, die hexadezimal angezeigt werden. Jeder Wert außerhalb des Bereichs 0x20
- 0x7E
ist kein "druckbares Zeichen " soweit es ASCII betrifft, und wird höchstwahrscheinlich nicht gut mit Befehlszeilenschnittstellen funktionieren.
Hinweis: Ich habe dein erstes "kaputt kopiert "-Zeile zur Verwendung in hexdump
Beispiel oben, also hat etwas das kein-ASCII-Leerzeichen ersetzt mit einem ASCII-Leerzeichen zwischen Ihrer ursprünglichen Quelle und Ihrer gerenderten Frage.
Führen Sie die folgenden Schritte aus, um dies zu wiederholen:
- Geben Sie
hexdump -Cv <<"EOF"
ein und drücken Sie Enter - Fügen Sie den Text ein, den Sie verwenden möchten
- Geben Sie
EOF
ein in eine eigene Zeile und drücken Sie Enter
Terminals und Befehlszeilenschnittstellen können mit Sonderzeichen nicht gut umgehen - wie Sie festgestellt haben. Wenn Sie beim Formatieren von Dokumenten nicht sehr vorsichtig sind, werden Sie auch Probleme mit Microsoft Word (und anderen) haben, die "intelligente Anführungszeichen verwenden ", em-Bindestriche, die Liste geht weiter...
Finden Sie den Unterschied:(Die Spitze ist "intelligente Anführungszeichen ", unten steht "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 Anführungszeichen keine einfachen ASCII-Anführungszeichen ("
), sind aber eine Unicode/UTF-8-Reihe - 0xE2
, 0x80
, 0x9C
, oder U+201C
- die das Terminal nicht wie erwartet handhaben wird.
Kiwys Vorschlag von cat -A
macht auch den Job:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Hinweis: bei Verwendung von echo "..." | hd
, besteht die Möglichkeit, dass bash Teile der Zeichenfolge, die Sie untersuchen möchten, ersetzt. Dies ist besonders wichtig, wenn Sie versuchen, Komponenten eines Skripts zu untersuchen.
Versuchen Sie zum Beispiel:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> 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 ein "hier zitiertes Dokument " ("EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
echo "<your command>" | hd
sollte arbeiten. Suchen Sie nach Backspace (0x08) oder Zeichen mit Codes>=80. echo "<your command>" | wc -b
Es ist auch eine gute Idee, zu überprüfen, ob die Anzahl mit dem übereinstimmt, was Sie sehen.
Das Kopieren von Dateien aus Dateien, die von irgendetwas mit "Office" im Namen erstellt wurden, ist gefährlich, da sich solche Software oft die Freiheit nimmt, Zeichen zu ersetzen:Achten Sie auf Französisch auf doppelte Anführungszeichen, die durch "guillemets" ersetzt werden, auf Englisch auf einfache Anführungszeichen, die durch ihre ersetzt werden Öffnen/Schließen-Äquivalente. Das Schwierigste, was ich je gefunden habe, war ein geschütztes Leerzeichen der Breite 0 in der Mitte eines Dateinamens (3 Tage Serverausfallzeit...).