Die Ausführungen der
vorherigen Seite werden hier weitergeführt. |
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 ![]() |
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 |