[gelöst] Warum rechnet bc hier nicht?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
zebulon42
Beiträge: 39
Registriert: 17.10.2017 11:15:09
Kontaktdaten:

[gelöst] Warum rechnet bc hier nicht?

Beitrag von zebulon42 » 08.06.2018 14:20:10

Moinsen.

Gegeben seien zwei Dateien, in denen einmal der aktuelle Dollarkurs in Euro ("dollar") und andermal der Goldkurs in Dollar ("gold") steht. Ein Script soll nun aus diesen beiden Dateien - man ahnt es schon? - den Goldkurs in Euro ausrechnen. Erster Schritt:

Code: Alles auswählen

echo \"`cat gold`*`cat dollar`\" | bc -l
Mhh. bc bemängelt einen Syntaxfehler. Die Ursache war schnell gefunden: bc benötigt einen Dezimalpunkt statt des Dezimalkommas und mag keine Tausendertrenner-Punkte. (Mhh: Wozu genau war noch mal "locale" gut :facepalm: ?) Nuja, also behelfen wir uns mit "tr". Das Ergebnis schaut gut aus. Aktuell steht das Gold auf 1.298,02$, der Dollar auf 0,85€.

Ergebnis von

Code: Alles auswählen

 echo \"`cat gold`*`cat dollar`\" | tr -d . | tr , .
: "1298.02*0.85"

Ergebnis von

Code: Alles auswählen

 echo "1298.02*0.85" | bc -l
: 1103.3170

Also alles in eine Pipe:

Code: Alles auswählen

 echo \"`cat gold`*`cat dollar`\" | tr -d . | tr , . | bc -l
Und nun erklärt mir bitte mal ein Wissender, warum die beiden Einzelschritte funktionieren, alles in einer Pipe jedoch den bc dazu bringt, die Rechenaufgabe statt des erwarteten Ergebnisses auszuspucken. Wieder einmal bin ich mit meinem Pinguinlatein am Ende.

TIA,
Ulrich
Zuletzt geändert von zebulon42 am 08.06.2018 16:47:41, insgesamt 1-mal geändert.

Benutzeravatar
Gharika
Beiträge: 209
Registriert: 28.09.2004 16:51:51
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Warum rechnet bc hier nicht?

Beitrag von Gharika » 08.06.2018 14:31:14

Es geht nicht, weil die Anführungszeichen es verhindern.

Code: Alles auswählen

 echo \"`cat gold`*`cat dollar`\" | tr -d . | tr , . | tr -d \" | bc -l
oder gleich

Code: Alles auswählen

 echo "`cat gold`*`cat dollar`" | tr -d . | tr , . | bc -l
Beleidigungen sind die Argumente derer, die unrecht haben.

-- Jean Jacques Rousseau

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Warum rechnet bc hier nicht?

Beitrag von tobo » 08.06.2018 14:42:03

Genau. Da wird nichts gequotet, sondern du übergibst das Zeichen ". Vergleiche mal mit Leerzeichen um das *, damit die volle Kraft des Globbings eintreten kann:

Code: Alles auswählen

echo \"`cat gold` * `cat dollar`\" | tr -d . | tr , . 
echo "`cat gold` * `cat dollar`" | tr -d . | tr , . 

Benutzeravatar
zebulon42
Beiträge: 39
Registriert: 17.10.2017 11:15:09
Kontaktdaten:

Re: Warum rechnet bc hier nicht?

Beitrag von zebulon42 » 08.06.2018 15:19:54

Gharika hat geschrieben: ↑ zum Beitrag ↑
08.06.2018 14:31:14
Es geht nicht, weil die Anführungszeichen es verhindern.
Komisch. In vielen Beispielen finde ich jene Anführungszeichen und empfand sie als obligatorisch. Und in den Einzelschritten gehen sie ja auch nicht verloren. Und das Quoten der Anführungszeichen hat auch solange nicht gestört, solange tr und bc nicht gleichzeitig im Spiel waren. Muss ich nicht verstehen. Genau das sind die Punkte, wo ich immer wieder über das Watschelvieh stolpere: foo|bar liefert ein Ergebnis (Konkret hier "1298.02*0.85" mit Gänsefüßen, obwohl gequotet), welches ich händisch eingetippt an baz weiterpipen kann. (Konkret hier: Echo "1298.02*0.85"|bc -l) Nur bei foo|bar|baz geschieht für meinen Verständnishorizont Merkwürziges.
oder gleich

Code: Alles auswählen

 echo "`cat gold`*`cat dollar`" | tr -d . | tr , . | bc -l
Danke, geht. Allerdings hätte ich dabei vermutet, ohne quoten der Gänsefüße gingen jene unterwegs verloren und nicht mit 8O. Schön, daß es dieses Forum hier gibt, wo man unbürokratisch und vor allem vorwurfslos gehelft wird. Danke auch an tobo, obwohl ich da noch weniger verstehe …

Jetzt kann ich auch noch ein tr . , ans Ende des Rattenschwanzes setzen, um für Open Office das Dezimalkomma wieder zu bekommen :D

TNX,
Ulrich

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Warum rechnet bc hier nicht?

Beitrag von tobo » 08.06.2018 15:56:41

zebulon42 hat geschrieben: ↑ zum Beitrag ↑
08.06.2018 15:19:54
Komisch. In vielen Beispielen finde ich jene Anführungszeichen und empfand sie als obligatorisch.
Sind sie ja auch.
Und in den Einzelschritten gehen sie ja auch nicht verloren.
Genau das ist das Problem! Beim Quoting tauchen die " ja überhaupt nicht auf, es schaltet lediglich die Sonderbeutung bestimmter Zeichen ab. In deinem Fall, die des * und theoretisch nach den beiden Kommandosubstitutionen.

Das hat auch nichts mit den Programmen die in der Pipe folgen zu tun. Vergleiche mal die Ausgaben:

Code: Alles auswählen

$ echo "`cat gold`*`cat dollar`"
1.298,02*0,85
$ echo \"`cat gold`*`cat dollar`\"
"1.298,02*0,85"
Im 2. Fall sind die " dabei. Und die gehen durch die Pipe und dann irgendwann nach bc. Öffne einfach mal bc und teste:

Code: Alles auswählen

$ bc
>1+1
2
>"1+1"
"1+1"
Da wird einfach nur ein String verarbeitet und du hast im Grunde genommen sogar Glück, dass bc das toleriert. Du könntest nämlich inhaltlich gleichberechtigt, genauso gut ein beliebiges anderes Zeichen außenrum setzen, z.B.:

Code: Alles auswählen

$ echo X`cat gold`*`cat dollar`X

Benutzeravatar
zebulon42
Beiträge: 39
Registriert: 17.10.2017 11:15:09
Kontaktdaten:

Re: Warum rechnet bc hier nicht?

Beitrag von zebulon42 » 08.06.2018 16:26:17

tobo hat geschrieben: ↑ zum Beitrag ↑
08.06.2018 15:56:41
zebulon42 hat geschrieben: ↑ zum Beitrag ↑
08.06.2018 15:19:54
Komisch. In vielen Beispielen finde ich jene Anführungszeichen und empfand sie als obligatorisch.
Sind sie ja auch.
Siehste! :wink:
Vergleiche mal die Ausgaben:

Code: Alles auswählen

$ echo "`cat gold`*`cat dollar`"
1.298,02*0,85
$ echo \"`cat gold`*`cat dollar`\"
"1.298,02*0,85"
Diese Einzelschritte (welche ich immer brauche, um mich langsam an die Lösung heranzutasten) hatte ich ja schon durch. Nur mit Quote bekam ich die obligatorischen(?) Anführungszeichen. Wenn ich mir dagegen die Lösung von Gharika so anschaue, sind sie eher störend. Für mich verbüffenderweise erst dann störend, wenn ich alles in eine Pipe packe, statt das Ergebnis von

Code: Alles auswählen

$ echo \"`cat gold`*`cat dollar`\"
"1.298,02*0,85"
händisch in den bc zu schütten.

Könnten wir uns bitte darauf einigen, daß ich hier eine Verständnislücke habe, die wohl durch Verständnis nicht zu schließen ist? :roll:

CU!
Ulrich

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Warum rechnet bc hier nicht?

Beitrag von tobo » 08.06.2018 16:48:44

Ein letzter Versuch: Mit Quoting bezeichnet man das umschließen einer Zeichenfolge mit " - damit werden die Zeichen darin ihrer Sonderbehandlung entzogen. Mit Escapen werden dagegen nur einzelne Zeichen, mit vorangestelltem \, ihrer Sonderbedeutung entzogen. Du entziehst den beiden " ihre Sonderbeutung, nämlich den darin eingeschlossenen Text als einen Parameter anzusehen, durch eben dieses Escapen (\"). Setze die Leerzeichen um den *, führe beide echos aus und dann siehst du was gequotet ist und was nicht. Quoting ist nicht dann, wenn " angezeigt werden, sondern wenn " verarbeitet werden.

Antworten