Drucken Sie eine Zeichenfolge mit einfachen Anführungszeichen und anderen Sonderzeichen

8

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?

batil
quelle
Meinen Sie damit, dass Sie clock=$(prtconf -s | awk '{print $4,$5}')Ausdruck in awkAnweisung verwenden möchten ?
Cuonglm

Antworten:

4

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:

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

Zum ersten:

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

(Das ist 'text'dann Apostroph flüchtete \'dann 'other text'.)

Beachten Sie der Vollständigkeit halber, dass printEscape-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 Sie print -r.

Matte
quelle
Sofern ich die Frage nicht falsch verstanden habe, möchte OP, dass der Befehl in der Textdatei und nicht im Ergebnis gedruckt wird (wenn es das Ergebnis ist, fehlen beim zweiten Versuch nur zwei Anführungszeichen).
Mat
Oh, sorry, meine Fehlinterpretation, Kommentar entfernen.
Cuonglm
4

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 als

  1. das einfach zitierte Literal foo
  2. das Backslash-zitierte wörtliche Zeichen '
  3. das einfach zitierte Literal 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 printBefehl ksh eine Backslash-Erweiterung durchführt. Fügen Sie die -rOption 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.

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

Alternativ können Sie die POSIX-Methode verwenden, um eine Zeichenfolge buchstäblich mit einem Zeilenumbruch am Ende zu drucken:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt
Gilles 'SO - hör auf böse zu sein'
quelle
1

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). printBefehl 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 $.

Tingrammer
quelle
1

Warum nicht einfach ein Dokument hier verwenden ?

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 <<ENDDollar-Expansion (dh $(command)oder $variable) durchgeführt werden.

Joseph R.
quelle