
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:
- das in einfachen Anführungszeichen gesetzte Literal
foo
- das durch einen Backslash in Anführungszeichen gesetzte Literalzeichen
'
- das in einfachen Anführungszeichen gesetzte Literal
bar
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 print
Befehl ksh eine Backslash-Erweiterung durchführt. Fügen Sie die -r
Option 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 print
Escape-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). print
Der 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 END
in <<'END'
: Sie bedeuten, dass der Text in den folgenden Zeilen (bis zur END
Markierung) wörtlich verwendet wird. Mit nur würde <<END
eine Dollarerweiterung (also $(command)
oder $variable
) durchgeführt.