2017-12-21 7 views
1

Ich versuche, "-" mehrfach mit printf zu drucken. Ich benutze den folgenden Befehl für mehrere Ausdrucke desselben Zeichens, was für alle außer "-" funktioniert.So drucken Sie "-" mit printf

Wenn ich versuche, das gleiche für "-" zu tun, gibt es einen Fehler.

printf "`printf '-%.0s' {1..30}` \n" 
bash: printf: -%: invalid option 

Es versucht, es als benutzerübergebene Option zu nehmen. Wie arbeite ich das an? OS ist Linux 6.

+2

@TomFenech einen Zeilenumbruch zu erhalten, denke ich. –

Antwort

3

Pass -- vor alles andere zu jedem printf Aufruf:

printf -- "`printf -- '-%.0s' {1..30}` \n" 

Wie viele Befehle, nimmt printf Optionen in Form von Token mit - beginnen (obwohl -v und -- sind die einzige Optionen, die ich kenne). Dies stört Ihre Argument-Zeichenfolge, da printf stattdessen versucht, -%.0s als eine Option zu analysieren. Für diesen Fall unterstützt es jedoch die -- Option (wie viele andere Befehle), die Option Parsing beendet und alle folgenden Argumente wörtlich durchläuft.

+0

Ich werde dies versuchen und informieren ... – Marcos

+0

@Sigura Das funktioniert perfekt .... und es löste eine andere von meinem Problem als auch ... Wenn wir printf verwenden, um Liste der Dateien mit Berechtigungen zu drucken, schlägt es fehl '-r' in '-rwx'. – Marcos

1

Versuchen Sie 30 Bindestriche zu drucken? Dies ist, wie ich das tun:

printf "%*s\n" 30 "" | sed 's/ /-/g' 

Der printf Befehl druckt eine Zeile mit 30 Räumen, dann sed verwenden sie alle in Bindestriche zu drehen

Diese in eine Funktion eingekapselt werden können:

ruler() { printf "%*s\n" "$1" "" | sed "s/ /${2//\//\\\/}/g"; } 

Und dann kann man solche Sachen tun:

ruler $(tput cols) = 
+0

Das kann etwas kompliziert werden, wenn ich versuche, so etwas zu machen - printf "' printf '-%. 0s' {1..30} '\ n $ Marcos

+0

Ich verstehe deinen Kommentar nicht. Verwenden Sie Backticks für die Codeformatierung und verwenden Sie '$()' in Ihrem Code anstelle von Backticks –