Verwechslung mit printf Befehl?

13

Ich muss die folgenden drei Zeilen in einem Druckbefehl drucken, ohne den Echo-Befehl zu verwenden. Also habe ich den Befehl printf gewählt. Hier sind die drei Zeilen:

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

Was ich bisher gemacht habe ist:

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

Aber ich habe einen Bash-Fehler für die dritte Zeile ',' bekommen.

Also wird mich jemand aufklären.

Narwen
quelle
Übrigens gibt es einen Unterschied zwischen dem printBefehl und dem printfBefehl.
Flimm

Antworten:

12

Besser zu benutzen:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

Sie bekommen diesen Fehler, wie andere hier gesagt haben, wegen des %Charakters, der speziell ist und dem man entkommen muss.

Siehe man 1 printffür weitere Informationen.

Radu Rădeanu
quelle
@Narwen Ich empfehle Ihnen, den Mann die ganze Zeit zu benutzen, wenn Sie mit Sonderzeichen spielen müssen. Geben Sie zum Suchen in man ein /your_string_to_searchund drücken Sie die Eingabetaste.
Radu Rădeanu
4
Der springende Punkt printfist dieser %Charakter und was er macht!
Kaz
14

%ist ein Sonderzeichen in printf. Das ist es, was den Fehler verursacht. Sie müssen es als entkommen %%.

$kann auch in doppelten Anführungszeichen durch die äußere Hülle ersetzt werden, daher sollten Sie es vermeiden ( \$). Es ist normalerweise einfacher, einfache Anführungszeichen zu verwenden.

Oli
quelle
5
Das Dollarzeichen ist nur dann besonders, wenn ein gültiger Variablenname folgt, was hier nicht der Fall ist.
Glenn Jackman
1
$variablewird durch die Shell ersetzt, nicht durch printf. Wenn Sie Ihre Zeichenfolge in einfache Anführungszeichen anstatt in doppelte Anführungszeichen setzen, $wird sie von der Shell nicht interpoliert und direkt an übergeben printf.
Flimm
@glennjackman Außer, dass es etwas Besonderes ist, wenn ein gültiger Variablenname folgt (unabhängig davon, ob diese Variable tatsächlich definiert $ist oder nicht), ist es auch etwas Besonderes, wenn{ ein spezielles Parametersymbol oder eine oder mehrere Ziffern folgen . Die Grundidee von dem, was Sie sagen, ist jedoch richtig.
Eliah Kagan
9

Das %ist etwas Besonderes für printf: Es ist das führende Zeichen bei Formatspezifizierern. Wenn Sie einen wörtlichen Prozentsatz wünschen, verwenden Sie%%

Glenn Jackman
quelle
9

Es ist ein bisschen überraschend zu sehen, dass Sie den echoBefehl, den Sie gewählt haben, printfstattdessen verwenden , wenn Sie nicht berechtigt sind, den Befehl zu verwenden .

Warum nicht cat?

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF
thom
quelle
Aber ich musste echo laut frage durch druckbefehl ersetzen. Aber danke für die Hilfe.
Narwen
2
Um zu vermeiden, dass Zeichenfolgen wie $fooim Text interpretiert werden , verwenden Sie cat <<'EOF'anstelle von cat <<EOF.
Lekensteyn
4

printfist ein formatierter Ausdruck, der als ersten Parameter eine Formatzeichenfolge verwendet. Die restlichen Parameter werden in der Formatzeichenfolge verwendet. Die drei Dinge, die Sie bei der Verwendung beachten sollten, printfsind:

  1. Obwohl viele Sprachen printfAnweisungen / Befehle / Funktionen haben, unterscheiden sie sich alle ein wenig. Überprüfen Sie daher immer die Details in der sprachspezifischen Dokumentation (C, Bash, PHP, Perl usw.).

  2. Sie sollten niemals vom Benutzer bereitgestellte Informationen in der Formatzeichenfolge verwenden. Dies ist immer eine Sicherheitslücke. Wenn Sie eine vom Benutzer angegebene Zeichenfolge anzeigen möchten, verwenden Sie eine Formatzeichenfolge wie "%s".

  3. Sowohl der Backslash ( \) als auch das Prozentzeichen ( %) sind Escape-Zeichen, die die Bedeutung der folgenden Zeichen ändern. Wenn in Ihrer Ausgabe ein Escape-Zeichen angezeigt werden soll, muss es von einem anderen Parameter aus escaped oder gezogen werden. Das Dollarzeichen ( $) ist nicht speziell für printf, sondern speziell für die Shell. Achten Sie daher auf Ihre Anführungszeichen.

printfeignet sich hervorragend zum Formatieren von Zahlen. Einzelheiten finden Sie auf den Manpages

hildred
quelle
2

Wie bereits erwähnt, ist das %Symbol speziell für printf.

Wenn Sie eine Zeichenfolge nur so ausdrucken möchten, wie sie ist, geben Sie printf %sals erstes Argument an und die in einfache Anführungszeichen eingeschlossene Zeichenfolge als zweites Argument:

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

Die Verwendung von einfachen Anführungszeichen anstelle von doppelten Anführungszeichen verhindert, dass die Shell Symbole wie interpoliert $.

Flimm
quelle