Striche in printf


37

Ich versuche, printf zu verwenden, um einige hübsche Ausgaben in einem Bash-Skript zu formatieren

z.B:
-----------------------
| This is some output |
-----------------------

Aber ich bin über ein Verhalten gestolpert, das ich nicht verstehe.

$ printf "--" gibt mir den fehler printf: usage: printf [-v var] format [arguments]

und $ printf "-stuff"führt zu-bash: printf: -s: invalid option

Anscheinend glaubt printf, ich würde versuchen, ein paar Argumente zu übergeben, ohne dass ich es tue.

Inzwischen habe ich ganz zufällig diese Problemumgehung gefunden:
$ printf -- "--- this works now ----\n"gibt mir--- this works now ----

Kann jemand dieses Verhalten erklären?



Gibt es Implementierungen, bei echodenen dies fehlschlagen würde echo ------------? Die meisten unterstützen nur -n(keine abschließenden Zeilenumbrüche), -e(interpretieren Zeichen mit umgekehrten Schrägstrichen) und sind möglich -E(interpretieren Sie sie NICHT). (BEARBEITEN: GNU /bin/echounterstützt auch --helpund --version.)
Januar

Antworten:


44

Das --wird verwendet , um das Programm zu sagen , dass alles , was folgt sollte nicht als Befehlszeile interpretiert werden Option zu printf.

Edit: Also das printf "--"du im Grunde versucht hast endete als "printf ohne Argumente" und ist damit gescheitert.


18
Mit anderen Worten, um zu drucken --, können Sie ausführen printf -- --.
l0b0

2
... und printf --ist dasselbe wie printf(Sie erhalten die gleiche Nachricht)
Peter.O

25

-- wird als eine Option interpretiert (in diesem Fall, um anzuzeigen, dass es keine weiteren Optionen gibt).

Bei der Verwendung sollte immer eine Formatzeichenfolge angegeben werden printf, um eine falsche Interpretation zu vermeiden. Für Ihren speziellen Fall:

printf '%s\n' '-----------------------'

Was ist, wenn Sie dies mit einer Sequenz tun müssen? printf '-%.0s' {1..54}
Qodeninja

2
@qodeninja Dann sind Sie eigentlich tun verwenden wollen --:-)printf -- '-%.0s' {1..54}
Chris Ab

4

Es gibt Unterschiede zwischen printf builtin und / usr / bin / printf, der zweite macht "was du meinst" ohne diese lästigen Fehler.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.