it-swarm.com.de

Die Verwendung von "printf" zum Drucken von Variablen mit "%" Prozentzeichen führt zu "bash: printf:` p ': ungültiges Formatzeichen ".

Ich möchte printf verwenden, um eine Variable zu drucken. Möglicherweise enthält diese Variable ein % Prozentzeichen.

Minimales Beispiel:

$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $

(echo liefert die gewünschte Ausgabe.)

6
finefoot

Verwenden Sie printf in seiner normalen Form:

printf '%s\n' "${TEST}"

Von man printf:

SYNOPSIS
printf FORMAT [ARGUMENT]...

Sie sollten nie eine Variable an die FORMAT-Zeichenfolge übergeben, da dies zu Fehlern und Sicherheitslücken führen kann.


Übrigens:

wenn Sie das Zeichen % als Teil des FORMATS haben möchten, müssen Sie %% eingeben, z.

$ printf '%d%%\n' 100
100%
16
pLumo

Sie sollten niemals variablen Inhalt in die Formatzeichenfolge einfügen, die printf zugewiesen wurde. Verwenden Sie stattdessen Folgendes:

printf '%s\n' "${TEST}"
10
Stephen Kitt

printf verwendet einen garantierten Parameter und dann eine Reihe zusätzlicher Parameter, je nachdem, was Sie übergeben. Also so etwas wie das:

printf '%07.2f' 5

wird verwandelt in:

0005.00

Der erste Parameter mit dem Namen "format" ist immer vorhanden. Wenn es keine % - Zeichenfolgen enthält, wird es einfach gedruckt. Somit:

printf Hello

erzeugt einfach Hello (insbesondere ohne den nachfolgenden Zeilenumbruch echo würde in seinem Standardmodus hinzugefügt). Wenn Sie erwarten, dass Ihr Beispiel funktioniert, wurden Sie durch Ihren früheren (unwissenden) Missbrauch dieser Tatsache in die Irre geführt. Da Sie aus der Sicht von format nur Zeichenfolgen ohne % s an printf übergeben haben, haben Sie immer wieder darum gebeten, Dinge auszugeben, für die keine Substitutionen erforderlich sind echo -ne.

Wenn Sie dies tun möchten rechts, möchten Sie wahrscheinlich beginnen, Ihre druckbaren Zeichenfolgen mit den integrierten Substitutionsfunktionen von printf zu bilden. Zeilen wie diese erscheinen überall in meinem Code:

printf '%20s: %6d %05d.%02d%%' "$key" $val $((val/max)) $((val*100/max%100))

Wenn Sie genau das möchten, was Sie gerade tun, möchten Sie echo -ne So:

TEST="contains % percent"
echo -ne "${TEST}\n"

Dadurch bleibt das (fragwürdige) Verhalten der Interpretation von \ - Escapezeichen innerhalb der Variablen erhalten. Es scheint auch ein wenig albern, -n Zu liefern und dann den \n Wieder anzukleben, aber ich biete es an, weil es ein globales Suchen und Ersetzen ist, das Sie auf alles anwenden können, was Sie gerade tun . Eine sauberere Version, bei der \ Immer noch nicht in der Variablen funktioniert, wäre:

TEST="contains % percent"
echo -e "$TEST"
3
BMDan