Holen Sie sich GNU bc, um ein Zeilenvorschubzeichen zu drucken

702
Melab

GNU bc ist sehr unkonventionell. Ich kann online nichts finden, wie man einen Newline-Charakter drucken kann. Ich versuche, die ersten 16 Hexadezimalziffern der Sinuszahlen der ganzen Zahlen von 1 bis 30 auszudrucken. Ich würde erwarten, dass so etwas funktioniert:

define mod(x, y) { oldscale=scale; scale=0; result=x%y; scale=oldscale; return result; } obase=16; x=1; while (x <= 30) { X=2^64*mod(s(x),1)-mod((2^64*mod(s(x),1)),1); print X"\n"; x=x+1; } 

Aber es tut nicht

1

1 Antwort auf die Frage

1
Xen2050

XIch habe gerade ein anderes mögliches Problem gefunden: Wenn Sie einen Großbuchstaben verwenden, geschieht dies, wenn ich versuche, es in zu verwenden bc:

X=3 (standard_in) 16: illegal character: X (standard_in) 16: syntax error 

Anscheinend sind nur Kleinbuchstaben Variablen (aus der Manpage: Eingabenummern können die Zeichen 0-9 und AF enthalten. (Hinweis: Es müssen Großbuchstaben sein. Kleinbuchstaben sind Variablennamen ).

Daher xwäre es eine gute Idee, zu einem anderen Kleinbuchstaben zu wechseln (da es bereits einen anderen Kleinbuchstaben gibt ).


Ich habe gerade versucht, einige sehr grundlegende Tests, offenbar mit printin bcmacht es nicht ein Newline drucken. Wenn Sie lediglich die Variable / Nummer in die eigene Zeile setzen, wird eine neue Zeile gedruckt:

$ echo "x=5; print x; print 999; x; 15; print 15; 12345"|bc 59995 15 1512345 

Ersetzen Sie Ihre print x"\n";Leitung mit nur x;sollte funktionieren?

Und mit a \nwith print sollte auch funktionieren, vielleicht hatten Sie ein Zitatproblem ... Als ich versuchte, bcdoppelte Anführungszeichen zu verwenden (definitiv falsch ;-) oder doppelte Anführungszeichen mit einfachen Anführungszeichen \n, schlägt das fehl:

$ echo "x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345"|bc (standard_in) 1: syntax error $ echo "x=5; print x; print 999; x; 15; print '15\n\n\n'; 12345"|bc (standard_in) 1: illegal character: ' (standard_in) 1: illegal character: \ (standard_in) 1: syntax error (standard_in) 1: illegal character: \ (standard_in) 1: illegal character: \ (standard_in) 1: illegal character: ' 

Aber mit einfachen Anführungszeichen für Echo und doppelten Anführungszeichen für die \ns funktioniert es

$ echo 'x=5; print x; print 999; x; 15; print "15\n\n\n"; 12345'|bc 59995 15 15   12345 

Also sollte auch das Ersetzen Ihrer print x"\n";Leitung print "x\n";funktionieren?

Ein informatives Zitat aus man bc:

Liste drucken
Die print-Anweisung (eine Erweiterung) stellt eine andere Ausgabemethode bereit. Die "Liste" ist eine Liste von Zeichenfolgen und Ausdrücken, die durch Kommas getrennt sind. Jeder String oder Ausdruck wird in der Reihenfolge der Liste gedruckt. Es wird kein abschließender Zeilenvorschub gedruckt. Ausdrücke werden ausgewertet und ihr Wert wird zuletzt gedruckt und der Variablen zugewiesen. Zeichenfolgen in der Druckanweisung werden in der Ausgabe gedruckt und können Sonderzeichen enthalten. Sonderzeichen beginnen mit dem umgekehrten Schrägstrich (\). Die von bc erkannten Sonderzeichen sind "a" (Alarm oder Glocke), "b" (Rücktaste), "f" (Seitenvorschub), "n" (Zeilenvorschub), "r" (Wagenrücklauf), "q" ( Anführungszeichen), "t" (Tab) und "\" (Backslash). Alle anderen Zeichen nach dem Backslash werden ignoriert.