GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich die wörtlichen Zeichen einer Bash-Befehlszeichenfolge überprüfen?

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:

  1. Geben Sie hexdump -Cv <<"EOF" ein und drücken Sie Enter
  2. Fügen Sie den Text ein, den Sie verwenden möchten
  3. 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...).


Linux
  1. Wie überprüfe ich, ob Bash Farben drucken kann?

  2. Wie kann ich das Argument des vorherigen Bash-Befehls abrufen?

  3. Wie kann ich PHP-Code von der Kommandozeile aus ausführen?

  4. So fügen Sie der Bash-Eingabeaufforderung ein Symbol hinzu

  5. Wie kann ich dem Anfang jeder Zeile in einer Datei eine Zeichenfolge voranstellen?

So verwenden Sie den Bash-Let-Befehl {mit Beispielen}

So verwenden Sie den Bash-Lesebefehl

Bash Heredoc

So prüfen Sie, ob eine Zeichenfolge in Bash eine Teilzeichenfolge enthält

Wie kann ich die letzte Zahl von String in Bash bekommen?

Wie kann ich eine Nagios-Prüfung manuell über die Befehlszeile ausführen?