Wie kann ich das mit einem AIX-Skript richtig 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 gibt mir:
clock=$(prtconf -s | awk {print ,})
Wenn ich " "
Anführungszeichen verwende:
print "clock=$(prtconf -s | awk '{print $4,$5}')"
Es gibt mir direkt zu:
clock=3612 MHz
Wie kann ich das lösen?
clock=$(prtconf -s | awk '{print $4,$5}')
Ausdruck inawk
Anweisung verwenden möchten ?Antworten:
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 den Dollarzeichen entkommen.
Für die zweite Option:
Zum ersten:
(Das ist
'text'
dann Apostroph flüchtete\'
dann'other text'
.)Beachten Sie der Vollständigkeit halber, dass
print
Escape-Sequenzen für Backslash-Zeichen erweitert werden (dies spielt in Ihrem Fall keine Rolle, da die Zeichenfolge, die Sie drucken möchten, keinen Backslash enthält). Um dies zu vermeiden, verwenden Sieprint -r
.quelle
Die einfache Möglichkeit besteht darin, einfache Anführungszeichen
'…'
um die Zeichenfolge zu verwenden. Einfache Anführungszeichen begrenzen eine Literalzeichenfolge, sodass Sie alles zwischen sie setzen können, außer ein einfaches Anführungszeichen'
. Verwenden Sie zum Einfügen eines einfachen Anführungszeichens in die Zeichenfolge die vierstellige Sequenz'\''
(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 zu setzen. Aufeinanderfolgende Literale sind jedoch genauso gut wie ein einzelnes Literal.
'foo'\''bar'
wird analysiert alsfoo
'
bar
Dies bedeutet effektiv, dass dies
'\''
eine Möglichkeit ist, einem einzelnen Anführungszeichen in einem einfach zitierten Literal zu entkommen.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 die zu druckende Zeichenfolge zufällig keinen Backslash enthält. Es ist jedoch besser, sie zu verwenden-r
, falls während der Wartung ein Backslash hinzugefügt wird.Alternativ können Sie die POSIX-Methode verwenden, um eine Zeichenfolge buchstäblich mit einem Zeilenumbruch am Ende zu drucken:
quelle
2 Lösung ist da, wie @Mat sagte.
1] Verwenden von einfachen Anführungszeichen
'
: Dieses einfache Anführungszeichen entfernt die spezielle Bedeutung von Escape-Zeichen$
und verschiedenen Befehlen (im Grunde alle Bash-Konstrukte und Unix-Befehle).print
Befehl nimmt alles als einfache Zeichen und schreibt dies in die Dateitest.txt
2] Verwenden von doppelten Anführungszeichen
"
: Hier müssen wir den Bash-Konstrukten explizit entkommen.\$
Entfernt die spezielle Bedeutung von$
, dh den Wert der nach verwendeten Variablen$
.quelle
Warum nicht einfach ein Dokument hier verwenden ?
Beachten Sie die Anführungszeichen
END
in<<'END'
: Sie bedeuten, dass der Text in den folgenden Zeilen (bis zurEND
Markierung) wörtlich verwendet wird. Mit nur würde<<END
Dollar-Expansion (dh$(command)
oder$variable
) durchgeführt werden.quelle