Drucken Sie eine Zeichenfolge einschließlich einfacher Anführungszeichen und anderer Sonderzeichen

Drucken Sie eine Zeichenfolge einschließlich einfacher Anführungszeichen und anderer Sonderzeichen

Wie kann ich das mit einem AIX-Skript korrekt schreiben? Meine Anforderung ist, diesen Befehl in test.txt zu schreiben:

clock=$(prtconf -s | awk '{print $4,$5}')

Ich habe diesen Befehl ausprobiert:

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

Die in test.txt geschriebene Ausgabe ergibt:

clock=$(prtconf -s | awk {print ,})

Wenn ich " "Anführungszeichen verwende:

print "clock=$(prtconf -s | awk '{print $4,$5}')"

Es ermöglicht mir direkt:

clock=3612 MHz

Wie kann ich das lösen?

Antwort1

Die einfachste Möglichkeit besteht darin, '…'die Zeichenfolge in einfache Anführungszeichen zu setzen. Einfache Anführungszeichen begrenzen eine wörtliche Zeichenfolge, sodass Sie alles außer einem einfachen Anführungszeichen dazwischen setzen können '. Um ein einfaches Anführungszeichen in die Zeichenfolge einzufügen, verwenden Sie die vierstellige Zeichenfolge '\''(einfaches Anführungszeichen, Backslash, einfaches Anführungszeichen, einfaches Anführungszeichen).

Technisch gesehen gibt es keine Möglichkeit, ein einfaches Anführungszeichen in ein einfaches Anführungszeichen gesetztes Literal einzufügen. Aufeinanderfolgende Literale sind jedoch genauso gut wie ein einzelnes Literal. 'foo'\''bar'wird wie folgt analysiert:

  1. das in einfachen Anführungszeichen gesetzte Literalfoo
  2. das durch einen Backslash in Anführungszeichen gesetzte Literalzeichen'
  3. das in einfachen Anführungszeichen gesetzte Literalbar

Dies bedeutet effektiv, dass dies '\''eine Möglichkeit ist, ein einfaches Anführungszeichen in einem Literal in einfachen Anführungszeichen zu umgehen.

Beachten Sie, dass der printBefehl ksh eine Backslash-Erweiterung durchführt. Fügen Sie die -rOption hinzu, um dies zu vermeiden. Es wird Ihnen nicht schaden, da der String, den Sie drucken möchten, zufällig keinen Backslash enthält, aber es ist besser, zu verwenden -r, falls während der Wartung ein Backslash hinzugefügt wird.

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

Alternativ können Sie die POSIX-Methode verwenden, um einen String wörtlich mit einem Zeilenumbruch am Ende auszudrucken:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

Antwort2

Sie müssen entweder weiterhin einfache Anführungszeichen verwenden, dann aber die in der Ausgabe benötigten Anführungszeichen „separat“ ausdrucken oder doppelte Anführungszeichen verwenden und die Dollarzeichen maskieren.

Für die zweite Option:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

Zum Ersten:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(Das wird dann durch 'text'ein einfaches Anführungszeichen maskiert .)\''other text'

Der Vollständigkeit halber sei darauf hingewiesen, dass printEscape-Sequenzen für Backslash-Zeichen erweitert werden (das spielt in Ihrem Fall keine Rolle, da die Zeichenfolge, die Sie drucken möchten, keinen Backslash enthält). Um dies zu vermeiden, verwenden Sie print -r.

Antwort3

Es gibt 2 Lösungen, wie @Mat gesagt hat.

1] Verwenden eines einfachen Anführungszeichens ': Dieses einfache Anführungszeichen entfernt die spezielle Bedeutung von Escape-Zeichen, $verschiedenen Befehlen (im Grunde alle Bash-Konstrukte und Unix-Befehle). printDer Befehl nimmt alles als einfache Zeichen und schreibt dies in eine Dateitest.txt

2] Verwenden von Anführungszeichen ": Hier müssen wir die Bash-Konstrukte explizit maskieren. \$Entfernt die besondere Bedeutung von $, d. h. den Wert der nach verwendeten Variable $.

Antwort4

Warum nicht einfach einhier Dokument?

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

Beachten Sie die Anführungszeichen ENDin <<'END': Sie bedeuten, dass der Text in den folgenden Zeilen (bis zur ENDMarkierung) wörtlich verwendet wird. Mit nur würde <<ENDeine Dollarerweiterung (also $(command)oder $variable) durchgeführt.

verwandte Informationen