Scripting Teil 3

Titelbild von Gerd Altmann alias geralt Pixaby

Dynamische Scripte

In diesem Beitrag gehe ich auf dynamische Scripte via Eingaben sowie Befehlssubtituonen und arithmetische Expansionen anhand eines Beipiel-Scripts ein

Um Scripte interaktiv zu machen, kann man den Anwender um Eingaben bitten. Das geht zB prinzipiell so:

read variablen_name

Befehlsssubstituton: Oft muss man die Ausgabe eines Befehls erfassen und einer Variablen zuweisen. Der Syntax dazu ist:

$(befehl)

Arithmetische Expansion: Der Syntax dazu ist die doppelte Klammerung. Die Shell wertet den mathematischen Ausdruck innerhalb der doppelten Klammer aus und ersetzt das Ergebnis.

$((ausdruck))

Beispiel: in diesem interaktiven Script benutzer_fragen.sh frage ich den Benutzer nach Name, Ort und Geburtsjahr und berechne das Alter in Jahren. Und gebe die Eingaben Name und Ort sowie das berechnete Alter aus. Schauen wir uns die Realisierung zunächst im Editor an.

#!/bin/bash
# benutzer_fragen.sh 
# Holt Eingaben vom Benutzer, holt Jahr vom System und berechnet Alter
# Quelle: Linux entschlüsselt Robert Frangias, modifiziert durch Gustav Sommer

# Hole aktuelles Jahr
aktuelles_jahr=$(date +“%Y”)
echo “Guten Tag! Wir schreiben das Jahr anno $aktuelles_jahr”

# liest die einzelnen einzeiligen (-p) Eingaben bis (Return/Enter) und 
# speichert in die jeweiligen Variablen
read -p “Wie ist Dein Name ? ” benutzer_name
read -p “Danke und im welchem Ort wohnst Du? ” benutzer_ort
read -p “In welchem Jahr bist Du geboren? ” benutzer_gjahr

# sehr einfache lineare Plausibilitätsprüfung, einstufig mit harten Grenzen
if [[ $benutzer_gjahr -ge 1900 && $benutzer_gjahr -le 2050 ]]; then
   echo “Aha, Du bist $((aktuellesjahr - benutzer_gjahr)) Jahre alt!”
else
   read -p "Überprüfe bitte Dein Geburtsjahr (Format YYYY) " benutzer_gjahr
   echo "Also Du bist wirklich $((aktuelles_jahr - benutzer_gjahr)) Jahre alt?"
fi

echo
echo "Schön dich kennen zu lernen, $benutzer_name aus $benutzer_ort."
echo "Ein interessanter Jahrgang $benutzer_gjahr."

Mit diesem Listing habe ich hier in der Web-Darstellung ein WordPress-Plugin mit Zeilennummerierung und seitlich einfacher Verschiebarkeit zu besseren Erfassung des Codes für meine Leser eingeführt. Im Original Nano-Editor sind die Zeilennummern nicht aktiv.

Die Zeile 7 hat das Ziel, das aktuelle Jahr in die Variable aktuelles_jahr zu speichern und die Zeile 8 gibt dieses als 4-stellige Zahl aus.

Die Zeilen 12 bis 14 lesen über read mit dem Parameter -p die Eingaben ein und weisen sie den jeweiligen Variablen zu. Der Parameter -p zeigt jeweils direkt einen Text als Eingabeaufforderung an, bevor die Benutzereingabe abgefragt und in einer Variablen gespeichert wird.
Die Zeilen 17 bis 23 beinhalten eine sehr einfach gehaltene, lineare IF-THEN-ELSE Plausibilitätsprüfung des Geburtsjahres mit hart codierten Grenzen zwischen 1900 und 2050. Die Zeilen 18 und 21 berechnen arithmetisch das Alter via doppelt geklammerter arithmetischer Expansion mit dem Syntax $((ausdruck))

Die Ausgabe der erfassten und berechneten Daten erfolgt dann in den letzten beiden Zeilen.

Schauen wir uns den Start des Scripts sowie die Ein- und Ausgaben mit zwei Beispielen am Terminal des servers1 an.

otto@server1:~/erste_spielwiese$ ./benutzer_fragen.sh
Guten Tag! Wir schreiben das Jahr anno 2025
Wie ist Dein Name ? Gustav
Danke und im welchem Ort wohnst Du? Hünxe
In welchem Jahr bist Du geboren? 1952
Aha, Du bist 73 Jahre alt!

Schön dich kennen zu lernen, Gustav aus Hünxe.
Ein interessanter Jahrgang 1952.
otto@aserver1:~/erste_spielwiese$

Im zweien Beispiel landen wir im ELSE-Pfad der Plausibilitätsprüfung, da bei der ersten Eingabe des Geburtsjahres nur eine zweistellige Zahl eingegeben wurde.

otto@server1:~/erste_spielwiese$ ./benutzer_fragen.sh
Guten Tag! Wir schreiben das Jahr anno 2025
Wie ist Dein Name ? Walli
Danke und im welchem Ort wohnst Du? Hünxe am Niederrhein
In welchem Jahr bist Du geboren? 51
Überprüfe bitte Dein Geburtsjahr (Format YYYY) 1951
Also 74 Jahre alt?

Schön dich kennen zu lernen, Walli aus Hünxe am Niederrhein.
Ein interessanter Jahrgang 1951.
otto@server1:~/erste_spielwiese$ 

Hier noch eine Version mit verbesserter Plausibiltätprüfung mit Hilfe einer (Endlos-)Schleife until-do-done:

#!/bin/bash
echo benutzer_fragen.sh V0.1
echo
# Holt Eingaben vom Benutzer, holt Jahr vom System und berechnet das Alter
# Quelle: Linux entschlüsselt Robert Frangias, modifiziert durch Gustav Sommer

# Hole aktuelles Jahr
aktuelles_jahr=$(date +“%Y”)
echo “Guten Tag! Wir schreiben das Jahr anno $aktuelles_jahr”

# Liest die einzeilige Eingabe bis (Return/Enter) und
# speichert in die Variable benutzer_name
read -p “Wie ist Dein Name ? ” benutzer_name
read -p “Danke und im welchem Ort wohnst Du? ” benutzer_ort
read -p “In welchem Jahr bist Du geboren? ” benutzer_gjahr

# Plausibilitätsprüfung, until-Schleife mit harten Grenzen
i=0
until [[ $benutzer_gjahr -ge 1900 && $benutzer_gjahr -le 2050 ]]; 
do
   echo “Neuer Versuch  $((i=i+1)) - Zahl zwischen 1900 bis $aktuelles_jahr”
   read -p “Überprüfe bitte Dein Geburtsjahr (Format JJJJ) ? ” benutzer_gjahr
done #Ende der Schleife
echo
echo “Aha $benutzer_name, Du bist also $((aktuelles_jahr - benutzer_gjahr)) Jahre alt!”
echo
echo “Schön dich kennen zu lernen, $benutzer_name aus $benutzer_ort.”
echo “Ein interessanter Jahrgang $benutzer_gjahr.”
echo

Hinweis: Ich bevorzuge in meinen Texten aus Gründen der besseren Lesbarkeit das Generisches Maskulinum. Weibliche und andere anderweitige Geschlechtsidentitäten werden dabei ausdrücklich mit gemeint, soweit es für die Aussage erforderlich ist.

Dieser Blog verfolgt keine kommerziellen Interessen. Etwaige Werbung ist kostenfrei! #supportyourlocal

One comment

  1. Mit diesem Beitrag habe ich ein WordPress-Plugin zur besseren Darstellung von Code u.a. mit Zeilennummerierung eingeführt. Der „SyntaxHighlighter Code Block“ ist (teilweise auch als „SyntaxHighlighter Evolved“ oder ähnlichen Varianten bekannt). Dieses Plugin unterstützt Zeilennummerierung (Line Numbers), farbliche Hervorhebung, zahlreiche Sprachen (inklusive Python und Bash/Shell), und wird regelmäßig aktualisiert.
    Seitliche Verschiebbarkeit und Kopieren des Codes waren für mich weitere Argumente, um die Userfreundlichlkeit für euch zu verbessern.

    Beste Grüße Gustav Sommer alias foto-gustav

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

This site uses Akismet to reduce spam. Learn how your comment data is processed.