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" ); 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" )

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 --width="280" --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag = $szM2 € \n\n <span size='large'color='blue'>19% Mehrwertsteuer = $szM1 € </span> \n\nBruttobetrag = $szM0 €"
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
Mit Rechtsklick auf die Datei scMW.sh wählt man wieder Eigenschaften. Dann vergibt man einen Namen, hier etwa
MWsteuer
Für das Icon wählt man die Datei C9.png aus dem Ordner Bla, dann schließt man das Eigenschaften-Menü.
Rechtsklick auf      und Ausführen 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" )

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 --width="280" --title="Mehrwertsteuer-Berechnung" --text "Nettobetrag = $szM2 € \n\n <span size='large'color='blue'>19% Mehrwertsteuer = $szM1 € </span> \n\nBruttobetrag = $szM0 €"
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." ; 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" )

if [ $? -eq 1 ]; then
exit
fi

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 --width="280" --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 €"

done
Man kann auch mit bc zweistellig runden - dazu ist auf der Seite
Debian Gnome mit bc runden
etwas aufgeschrieben.

Man kann auch das icon von zenity --question ändern:

Man ergänzt den Text von
zenity --question
durch

--icon-name=emblem-default

Man ergänzt den Text von
zenity --question
durch

--icon-name=face-glasses
Man kann auch eigene Icons benutzen. Diese muß man in den Ordner /usr/share/icons/ kopieren, z.B. das Mehrwertsteuer-Icon aus dem Ordner ~/Bla. Dazu muß man sich mit su anmelden und eingeben (abc durch Ihren username ersetzen)
cp /home/abc/Bla/C9.png /usr/share/icons/
Dann den Text von zenity --question
ergänzen durch
--icon-name=C9
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

Datenschutzerklärung
Impressum