zur Übersicht

nächste Seite


Programmfenster für MWsteuer

Die Ausführungen der vorherigen Seite werden hier weitergeführt.
Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste. 
Oder man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Editors ein.  
Dann drückt man zum Abspeichern gleichzeitig Strg und O 
dann drückt man die Eingabetaste um den Dateinamen zu bestätigen 
dann drückt man zum Verlassen des Editors gleichzeitig Strg und X.


Das Terminal ist dazu da Eingabe-Kommandos auszuführen (also Programme zu starten). Diese muß man natürlich nach den programmierten Schreibweisen eingeben. Das Terminal selbst ist kein Text-Programm und kein Rechenprogramm. Eingabe von Text und nachfolgend gedrückte Eingabetaste führt zu keinem Ergebnis, z.B.

Regenwald

bash: Regenwald: Kommando nicht gefunden.

Es sei denn daß der eingegebene Text (in der geschriebenen Zeichenfolge) dem Namen eines Programmes entspricht 

nautilus

Das Drücken der Eingabetaste führt dazu, daß "Persönlicher Ordner" gestartet wird. 
nautilus
ist also der Name eines Programmes. Es gibt ein Programm 
alias
das eine Zeichenfolge als Name für ein Programm festlegt (meistens verwendet für die Abkürzung von komplexeren Programm-Befehlen) 

alias Regenwald='nautilus'

Nach dem Drücken der Eingabetaste wurde ein neues Programm erzeugt mit dem Namen Regenwald. Eingabe von 
Regenwald
und nachfolgend gedrückte Eingabetaste führt jetzt dazu daß "Persönlicher Ordner" gestartet wird. Das Terminal hat sich diesen Programmnamen gemerkt und zwar solange bis das Terminal geschlossen wird.
Einige Programme geben im Terminal Zeichenfolgen aus, z.B.

date

Fr 6. Okt 10:38:42 CEST 2017

Besonders auch das Programm echo: 

echo Regenwald

Regenwald

auch: 

echo nautilus

nautilus

Zudem hat das Terminal die Fähigkeit sich Zeichenfolgen zu merken - diese werden als Variable zwischengespeichert und zwar solange bis das Terminal geschlossen wird. Z.B. die Zahl 12 
Die Zahl 12 alleine im Terminal einzugeben und Eingabetaste zu drücken ist aber sinnlos, da dies kein Programm ist. Aber echo ist ein Programm, das die Zahl 12 ausgibt, also kann man die Variable 12 im Terminal definieren durch

A=$(echo 12)

Da Zeichenfolgen als Variablen sehr oft vorkommen gibt es eine kürzere Möglichkeit

B=8

Die Variable A wird im Terminal mit $A angesprochen. Aber wie bei Regenwald und der Zahl 12 ergibt die Eingabe von $A und nachfolgend gedrückte Eingabetaste kein Ergebnis, da $A kein Programm ist (es ist nur eine Erinnerung für das Terminal an die hinterlegte Zeichenfolge). Man benutzt wieder  echo  um im Terminal etwas auszugeben 

echo $A

12

echo ist ein ganz zentrales Programm und die Programmierung enthält viele Besonderheiten 

echo "$B"

8

Anführungszeichen " " haben die Funktion Programme zu deaktivieren und werden von echo nicht als Textzeichen ausgegeben. Man kann ein weiteres Funktionszeichen \ verwenden um das Funktionszeichen " zu deaktivieren und damit in ein normales Textzeichen zu verwandeln

echo \"$B\"

"8"

echo ; echo $B

8

Stehen hinter echo weitere Programme die Text im Terminal ausgeben
; echo $B
so werden diese zuerst ausgeführt und dann von dem ersten geschriebenen echo ausgegeben. Hier können Anführungszeichen " " weiterhelfen

echo "; echo $B"

; echo 8

Anführungszeichen führen aber nicht immer zum erwarteten Ergebnis

echo "$(cal)"
Oktober 2017
So Mo Di Mi Do Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Dann kann man ein stärkeres Mittel anwenden  '   '  (einfache Anführungszeichen)

echo '$(cal)'

$(cal)

Anderes Beispiel

echo D*

Downloads 

Ausgegeben werden alle Dateien und Ordner in ~/ die mit D beginnen (da der Eingabeprompt in ~/ liegt) 
Und das sind nur einige Beispiele. Man muß also schon etwas mehr über echo wissen. Auch Klammern beeinflussen die Ausgabe von echo 

echo ($A+$B)/3

bash: Syntaxfehler beim unerwarteten Wort `$A+$B' 

d.h. die Verwendung von ( ) ist für andere programmierte Eingaben vorgesehen. Man erzeugt mit  ( )  ein Terminal innerhalb des Terminal, eine Subshell. Innerhalb  ( )  müssen Eingabe-Kommandos (zu startende Programme) stehen und das sind $A + $B eben nicht. Innerhalb der Subshell (  )  stehen alle Variablen des Terminals zur Verfügung aber neu erzeugte Variablen innerhalb der Subshell ( ) sind nur innerhalb der Subshell vorhanden. Als Rückgabewert wird der Exit-Code des zuletzt in der Subshell ausgeführten Kommandos zurückgegeben. 

( A=500; echo $B Eier und $A gr. Mehl)

8 Eier und 500 gr. Mehl

der Rückgabewert ist hier die Textausgabe von echo. Die Variable $B wird vom Terminal bezogen. Die Variable $A=500 wirkt jedoch nur innerhalb der Subshell ( ) was man durch die Terminal-Eingabe
echo $A
nachprüfen kann, denn es wird 12 ausgegeben und nicht 500. Noch deutlicher wird dies wenn man den Rückgabewert der Subshell als neue Variable definiert 

D=$( A=500; echo $B Eier und $A gr. Mehl); echo Rezept $A: $D

Rezept 12: 8 Eier und 500 gr. Mehl

Man sieht daß $A innerhalb der Subshell anders ausgegeben wird als im Terminal. Und man sieht auch, daß die allererste Variable auf dieser Seite $A im Terminal durch eine Subshell definiert wurde.

Man kann die Funktionszeichen ( ) deaktivieren und in normale Textzeichen verwandeln durch 
echo "("$A+$B")"/3
oder 
echo \($A+$B\)/3
Aber am einfachsten macht man dies indem man den ganzen Ausdruck in " setzt 

echo "($A+$B)/3"

(12+8)/3

Gerechnet wird nicht, denn echo ist nur ein Programm um Zeichenfolgen auszugeben. Also braucht man als nächstes ein Rechenprogramm, z.B. 
bc
und die Ausgabe von echo reicht man dann an das Rechenprogramm weiter 
(mit dem Zusatz -l wechselt man in den mathematischen Modus, -q verhindert die Anzeige des Copyright-Hinweis): 

echo "($A+$B)/3" | bc -ql

6.66666666666666666666

Man kann die Anzahl der Stellen hinter dem Komma-Punkt bestimmen durch
scale= 
hier zweistellig: 

echo "scale=2; ($A2+$A3)/3" | bc -ql

6.66

Die weiteren Nach-Komma-Punkt-Stellen werden einfach abgeschnitten, es erfolgt keine kaufmännische Rundung was bei Preisangaben unvorteilhaft ist. Folgende Eingabe

echo "scale=2; 6.008/1" | bc -ql

6.00

zeigt, daß Nach-Komma-Punkt-Stellen mit Nullen ausgegeben werden, es wird 6.00 geschrieben und nicht 6 (dies ist bei Preisangaben sinnvoll)
Ein anderes Rechenprogramm 

gawk 'BEGIN {print ('$A'+'$B')/3 }'

6.66667

rundet auf oder ab, was bei Preisangaben sinnvoll ist. Durch die Programmierung bedingt muß man die Variablen in ' ' setzen. Die Standardausgabe sind 5 Stellen hinter dem Komma-Punkt. Die Anzahl der Nach-Komma-Punkt-Stellen kann man ändern durch
(OFMT="%.2f"    bedeuted z.B. zwei Stellen hinter dem Komma-Punkt): 

gawk 'BEGIN {OFMT="%.2f";print ('$A'+'$B')/3 }'

6.67

Folgende Eingabe

gawk 'BEGIN {OFMT="%.2f";print 6.00001 }'

6.00

zeigt, daß Nach-Komma-Punkt-Stellen mit Nullen ausgegeben werden, es wird 6.00 geschrieben und nicht 6 (dies ist bei Preisangaben sinnvoll)

Nun kann man schon 
Mehrwertsteuer über zenity-Fenster
berechnen.
Zuerst erstellt man ein Eingabefenster für den Bruttobetrag.  

Man kann bei zenity durch   \n   einen Zeilenumbruch auslösen
Man kann den Button-text ändern durch
--ok-label "Berechnen"
--cancel-label "Abbrechen"

Rückgabewert für folgendes Fenster durch 

szZahl=$(zenity --entry --ok-label "Berechnen" --title "Bitte eine Zahl eingeben" --text " Anstelle von Komma \n bitte Punkt verwenden" --entry-text "kein Komma verwenden" 2> /dev/null); echo $szZahl

Die Variable szZahl ist jetzt im Terminal gespeichert und man kann rechnen 

szM1=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'*.19/1.19 }'); echo $szM1

szM1 ist die Variable für den Mehrwertsteuerbetrag, die jetzt auch im Terminal gespeichert ist. Und man kann weiter rechnen

szM2=$(echo "scale=2; $szZahl - $szM1" | bc -ql); echo $szM2

szM2 ist die Variable für den Nettobetrag. 
Bei Eingabe einer Ganzzahl im zenity-Fenster erscheinen keine Kommastellen, bsp. szZahl=87
dann ergibt
echo $szZahl
87

Daher wird eine kleine List angewendet, um den Bruttobetrag auch mit Nachkommastellen auszugeben.
szM0=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'+0.0001 }'); echo $szM0
87.00

Nun kann man ein neues Script schreiben: 

nano ~/Bla/scMW.sh

Eingabe in den Editor: 

#!/bin/bash

szZahl=$(zenity --entry --ok-label "Berechnen" --title "Bitte eine Zahl eingeben" --text " Anstelle von Komma \n bitte Punkt verwenden" --entry-text "kein Komma verwenden" 2> /dev/null)

szM0=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'+0.0001 }')

szM1=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'*.19/1.19 }')

szM2=$(echo "scale=2; $szM0 - $szM1" | bc -ql)

zenity --info --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag = $szM2 \n\n <span size='large'color='blue'>19% Mehrwertsteuer = $szM1 </span> \n\nBruttobetrag = $szM0 " 2> /dev/null

Nun muß man diese Datei ausführbar machen (also in ein Programm verwandeln): 

chmod +x ~/Bla/scMW.sh

Aufruf im Terminal und Eingabe von 55.87

Nun erzeugt man noch ein kleines Bild für das Programm: 

convert -size 48x48 xc:red \( -size 40x40 xc:yellow \( -size 30x30 -background green -gravity center -fill black -font FreeSerif -pointsize 36 label:M \) -gravity center -composite \) -gravity center -composite ~/Bla/C9.png
Anschließend erstellt man wieder einen Programmstarter indem man einen Rechtsklick auf dem Desktop oder in einem Ordner macht und auswählt 
Neues Dokument 
Neuer_Starter 
Dann vergibt man einen Namen, hier etwa 
MWsteuer
Auf das Pin-Symbol macht man anschließend einen Rechtsklick und wählt Eigenschaften. Man füllt die Felder entsprechend aus, wie auf der vorhergehenden Seite aber jetzt mit  scMW.sh
Für das Icon wählt man die Datei C9.png aus dem Ordner Bla, dann schließt man das Eigenschaften-Menü. 
Doppelklick auf      ergibt: 

Man kann auch dafür sorgen, daß ein mögliches Komma bei der Eingabe des Bruttobetrages in einen Punkt verwandelt wird (damit gerechnet werden kann) und auch daß bei der Ausgabe die Punkte durch Komma ersetzt werden (damit die Preise wie üblich dargestellt werden).

Dazu wird das Script etwas anders geschrieben: 

nano ~/Bla/scMW.sh

Eingabe in den Editor: 

#!/bin/bash

szZa=$(zenity --entry --ok-label "Berechnen" --title "Bitte eine Zahl eingeben" --text " Zahl mit Komma möglich \n Zahl mit Punkt möglich" --entry-text "Bruttobetrag eintippen" 2> /dev/null)

szZahl=$( echo $szZa | sed 's/,/\./g' )

szMW0=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'+0.0001 }')

szMW1=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'*.19/1.19 }')

szMW2=$(echo "scale=2; $szMW0 - $szMW1" | bc -ql)

szM0=$( echo $szMW0 | sed 's/\./,/g' )

szM1=$( echo $szMW1 | sed 's/\./,/g' )

szM2=$( echo $szMW2 | sed 's/\./,/g' )

zenity --info --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag = $szM2 \n\n <span size='large'color='blue'>19% Mehrwertsteuer = $szM1 </span> \n\nBruttobetrag = $szM0 " 2> /dev/null

Wenn man möchte daß nach erfolgter Berechnung gleich die Möglichkeit vorhanden ist eine weitere Berechnung durchzuführen (ohne das Programm wieder neu starten zu müssen) braucht man ein Fenster das eine Wahlmöglichkeit präsentiert. Dies ist z.B. möglich mit
zenity --question
Den Rückgabewert kann man erhalten mit

zenity --question --ok-label "Neue Eingabe" --cancel-label "Fertig" --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag usw." 2> /dev/null; echo $?

Wenn man auf die Schaltfläche
Neue Eingabe
klickt so erhält man den Rückgabewert 0
Solange also 0 zurückgegeben wird, solange soll eine Schleife laufen und alles wieder von vorne beginnen. Bei Drücken der Schaltfläche
Fertig
wird nicht mehr 0 zurückgegeben, der Rückgabewert ist 1, und damit endet die Schleife.

Dazu wird das Script wieder etwas anders geschrieben: 

nano ~/Bla/scMW.sh

Eingabe in den Editor: 

#!/bin/bash

while [ $? -eq 0 ]

do

szZa=$(zenity --entry --ok-label "Berechnen" --title "Bitte eine Zahl eingeben" --text " Zahl mit Komma möglich \n Zahl mit Punkt möglich" --entry-text "Bruttobetrag eintippen" 2> /dev/null)

szZahl=$( echo $szZa | sed 's/,/\./g' )

szMW0=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'+0.0001 }')

szMW1=$(gawk 'BEGIN {OFMT="%.2f";print '$szZahl'*.19/1.19 }')

szMW2=$(echo "scale=2; $szMW0 - $szMW1" | bc -ql)

szM0=$( echo $szMW0 | sed 's/\./,/g' )

szM1=$( echo $szMW1 | sed 's/\./,/g' )

szM2=$( echo $szMW2 | sed 's/\./,/g' )

zenity --question --ok-label "Neue Eingabe" --cancel-label "Fertig" --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag = $szM2 \n\n <span size='large'color='blue'>19% Mehrwertsteuer = $szM1 </span> \n\nBruttobetrag = $szM0 " 2> /dev/null

done

Ein ganz wesentliches Element bei Terminal-Eingaben ist also ob es sich bei einem Zeichen um ein unveränderliches Element handelt oder um ein Zeichen das Funktionen auslöst. Und dementsprechend werden andere Funktionszeichen
"
'
\
gebraucht um zu den gewünschten Ergebnissen zu gelangen. Ein nettes Beispiel habe ich im Internet gefunden. Man definiert die Variablen
x=0
y=1
Welche Ausgabe liefert nun echo:

echo $x_$y
1

echo "$x_$y"
1

echo '$x_$y'
$x_$y

echo '$x\_$y'
$x\_$y

echo "$x\_$y"
0\_1

echo $x\_$y
0_1

echo $x'_'$y
0_1

echo $x"_"$y
0_1

echo "$x"_"$y"
0_1

Bei diesem Beispiel hat allerdings das Zeichen _ keine Funktion. Das Problem ist hier die Abgrenzung der ersten Variablen. Das Terminal liest die erste Variable als $x_ und eine solche gibt es nicht, also wird auch dafür nichts ausgegeben. 
Man könnte auch eine weitere Variable definieren
z=_
und verwenden

echo $x$z$y
0_1

Ein anderes Beispiel bei dem man folgende Variable erzeugt

sC=Schiff

echo $sC
Schiff

Nun soll   Schiffsüberfahrt   geschrieben werden 

echo $sCsüberfahrt
überfahrt

Das Terminal liest die Variable als $sCs und die gibt es nicht, also wird auch dafür nichts ausgegeben. Der Umlaut ü bremst das Terminal beim Lesen des Variablen-Namens aus, denn Umlaute darf es bei Variablen-Namen nicht geben, man kann es probieren z.B. 

sü=funktioniert-nicht

Daher ist alles ab  ü  normaler Text und dieser wird ausgegeben. Man muß sagen wo der Variablen-Name zuende ist 

echo $sC\süberfahrt
Schiffsüberfahrt

echo "$sC"süberfahrt
Schiffsüberfahrt

echo ${sC}süberfahrt
Schiffsüberfahrt

zur Übersicht

nächste Seite