ubuntuusers.de

Ich habe ein Problem mit dem Terminal. bc und echo und Pipe etc

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Lae6ge6k

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Hallo. Ich habe ein Problem mit dem Terminal. Das folgende funktioniert (Script1).

12:29:20 internet > echo "scale=6; 5/0.1" | bc
50.000000

Aber ab hier funktioniert es nicht (Script2).

12:40:19 internet > neu=12 | echo "scale=5;(($neu*4.8*10.034*1.19)/100)/12" | bc | echo "Euro"
Euro
(standard_in) 1: syntax error
(standard_in) 1: syntax error

Eine kleine Erklärung. bc nutze ich um mit Flieskommazahlen (Floating poit) zu rechnen. scale ist die nachkomastellen Genauigkeit.

Wie müsste ich die Terminaleingabe richtig machen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

neu=12 ist eine Variablenzuweisung in der Bash. Diese hat keinen Output, den man per Pipe an echo weiterleiten könnte. Auch nicht an sonstwen, aber an echo vor allem nicht, denn echo liest auch nicht von stdin.

Kann man prüfen, in dem man echo pur aufruft. Es wird nichts eingelesen, nichts ausgegeben und das Programm (oder die Bashfunktion) wird beendet.

Mit type findet man heraus, dass die interne Funktion der Bash benutzt wird, nicht /usr/bin/echo .

1
2
type echo
echo ist eine von der Shell mitgelieferte Funktion.

Die bc-Syntax kennt aber Variablen selbst - nur ohne $ vorab. neu=12; kann also an bc direkt verfüttert werden. Hier steht es ganz am Anfang, um Deinem Konstrukt ähnlich zu bleiben - man würde aber eher das scale=5 an den Beginn setzen, und dann erst die Zuweisung der Werte vornehmen.

1
2
 echo $(echo "neu=12;scale=5;((neu*4.8*10.034*1.19)/100)/12" | bc) Euro 
.57314 Euro

Die Ausgabe kann man dann mit $(...) in einen Echobefehl einbetten, der auch noch Euro ausgibt.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Syntax-Konform. Welchen Sinn hat es denn "neu=12" an den nachfolgenden Befehl zu PIPEN?

echo "$(neu=12; echo "scale=5;(($neu*4.8*10.034*1.19)/100)/12" | bc | awk '{printf "%f", $0}') Euro"
0.573140 Euro

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Wenn die Zuweisung nur ein Platzhalter ist, weil die neu=... anderweitig gefüllt wird, und nur in der Bash vorkommt und nicht an bc delegiert werden kann, dann kann man den bc-Befehl (echo "bla bla befehl" | bc) aufbrechen, und die Variable vorab evaluieren lassen:

1
2
neu=12;echo $(echo "scale=5;(("$neu"*4.8*10.034*1.19)/100)/12" | bc) Euro 
.57314 Euro

bc bekommt dann nie das $neu zu sehen, sondern die Bash ersetzt zuvor die Variable durch den Wert.

Lae6ge6k

(Themenstarter)

Anmeldungsdatum:
19. Februar 2013

Beiträge: 566

Ich bedanke mich bei seahawk1986

Und auch ein Dankeschön an user unknown

Ihr habt mir geholfen, und auch eure Erklärungen sind für mich als Anfänger, in Sachen programmieren, plausibel.

Mein Ziel ist noch etwas ungewiss, ich tendiere weiterhin zu gcc also g++, aber manchmal hilft auch das Terminal weiter.

Da ich mich bedankt habe, ist hiermit der Thread „Ich habe ein Problem mit dem Terminal. bc und echo und Pipe etc“ gelöst.

Mit freundlichen grüssen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

ANDREAS 1967 schrieb:

Mein Ziel ist noch etwas ungewiss, ich tendiere weiterhin zu gcc also g++, aber manchmal hilft auch das Terminal weiter.

Wenn Du nicht hardwarenah programmieren musst, also Treiber, würde ich von C und C++ abraten.

Wenn alles im kleinen Rahmen bleiben soll würde ich Python empfehlen (obwohl ich es selbst nicht nutze) weil es starke Unterstützung im Linuxumfeld hat und recht modern ist. Ansonsten Java als einfache Sprache die viele Probleme von C und C++ vermeidet mit der Option zu Scala zu wechseln, wenn es auch schwieriger sein darf.

Antworten |