













Besser lernen dank der zahlreichen Ressourcen auf Docsity
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Prüfungen vorbereiten
Besser lernen dank der zahlreichen Ressourcen auf Docsity
Download-Punkte bekommen.
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Community
Finde heraus, welche laut den Docsity-Nutzern die besten Unis deines Landes sind
Kostenlose Leitfäden
Lade unsere Leitfäden mit Lernmethoden, Hilfen zur Angstbewältigung und von Docsity-Tutoren erstellte Tipps zum Verfassen von Haus- und Abschlussarbeiten kostenlos herunter
Lösungen zu den Übungen zur Bash-Programmierung im Kurs Wirtschaftsinformatik II, Prof. Mandl, Sommersemester 2020
Art: Übungen
1 / 21
Diese Seite wird in der Vorschau nicht angezeigt
Lass dir nichts Wichtiges entgehen!
Sonderangebot
Prof. Dr. Peter Mandl, Björn Rottmüller, M. Sc.
Betrachten Sie sich mit dem Kommando env bzw. printenv oder auch set die in Ihrer Bash-Session vorhandenen Umgebungsvariablen und machen Sie sich einige Notizen dazu. Erzeugen Sie eine eigene Umgebungsvariable, die Ihren Namen hat und weisen Sie einen beliebigen Wert zu. Führen Sie das Kommando env, printenv oder set erneut aus und suchen Sie nun in der Ausgabe nach Ihrer Umgebungsvariablen. env und printenv zeigen alle exportierten Umgebungsvariablen an. set zeigt zusätzlich noch die nicht exportierten Umgebungsvariablen und auch definierte Shell-Funktionen an. Neue Variable anlegen: MANDL=“Peter Mandl“ Neue Variable wird nur mit set-Kommando angezeigt.
Erzeugen Sie mit dem Kommando declare eine Umgebungsvariable mit dem Namen i1 vom Typ Integer und weisen ihr den Wert 1350 zu. Erzeugen Sie eine zweite Umgebungsvariable i2 vom gleichen Typ und weisen Sie ihr den Wert von i1 zu. Zeigen Sie die neuen Umgebungsvariablen auf der Konsole an und löschen Sie diese anschließend wieder. declare – i i1= declare – i i2=$i Anzeigen mit declare - i oder echo $i1 $i Löschen mit: unset i unset i
Lassen Sie sich die Kommando-Historie in Ihrer Bash-Session ausgeben und versu- chen Sie einige Befehle aus der Historie aufzurufen. Löschen Sie danach die Kom- mandos-Historie und geben Sie nochmals das Kommando history ein. Notieren Sie sich wichtige Aspekte. Das Kommando „history“ eingeben liefert die Historie der schon eingegebenen Befehle. Das Kommando „history – c“ löscht die komplette History der aktuellen Session. Über ein „!“ gefolgt von einer positiven oder negativen Zahl können Befehle erneut ausge- führt werden. !10 führt das 10. Kommando in der Historie aus. !-10 führt das zehntletzte Kommando nochmals aus. !- 1 führt das letzte Kommando aus Möchte man die History auch über die Session hinweg löschen, gibt man zusätzlich das Kommando „history – w“ ein. Hier wird die Datei, in der die History abgespeichert wird, gelöscht.
ls
Erzeugen Sie mit dem touch-Befehl eine neue Datei in Ihrem Home-Verzeichnis und lassen Sie sich anschließend mittels ls-Befehl die Berechtigungsinformationen dazu anzeigen. cd touch neue-datei ls – la oder ls Ändern sie nun die Berechtigung für diese Datei auf r--r--r--. Versuchen Sie an- schließend den Inhalt der Datei zu ändern (am einfachsten über einen Editor). Was passiert und warum? chmod 444 neue-datei vi neue-datei Editieren der Datei und diese mit vi-Kommando ESC :wq versuchen zu speichern. Es wird eine Fehlermeldung ausgegeben, die besagt, dass die Berechtigung nicht gegeben ist. Dies leigt an den der vorher festgelegten Berechtigungen, die nur das Lesen und nicht das Verändern der Datei erlauben. Füllen Sie in der folgenden Tabelle die fehlenden Lücken aus! Befehl Binär Anzeige bei ls - l chmod 440
Setzen Sie die Berechtigungsmaske mit dem umask-Kommando so, dass der Eigen- tümer lesen und schreiben darf, die Gruppe nur lesen und anderen gar nichts er- laubt ist.
Erzeugen Sie nun eine beliebige neue Datei und betrachten Sie deren Zugriffsrech- te mit dem ls-Kommando. umask 026 oder umask 027 oder umask u=rw,g=r,o= touch noch-eine-datei ls – al noch-eine-datei Die Zugriffsrechte - rw-r----- werden für die Datei mit dem Namen „noch-eine-datei“ ange- zeigt.
Ändern Sie nun die Datei .bashrc in Ihrem Home-Verzeichnis so ab, dass bei jedem Start eines Terminals ein Begrüßungstext und der Inhalt Ihres Home- Verzeichnisses ausgegeben wird. cd In die Datei .bashrc im Homeverzeichnis (siehe $HOME) die folgenden Zeilen z.B. mit dem einfügen: echo Hallo Student, viel Spass weiterhin in der Uebung ls Schreiben in die Datei geht so (später nutzen wir einen Editor wie den vi): echo - e “echo Hallo Student, viel Spass weiterhin in der Uebung \nls“ > .bashrc Hinweise:
Das Kommando läuft nun im Hintergrund und ist nicht mehr der Terminalgruppe zuge- ordnet. Wenn Sie nun die Bash und auch die Login-Shell beenden und sich anschließend innerhalb von 1000 ms (siehe sleep 1000) wieder einloggen, sehen Sie mit dem Kommando „ps aux | grep sleep“ auch den sleep-Prozess, der nun nicht mehr in der Terminalgruppe hängt (zu erkennen am Fragezeichen in der TTY-Spalte).
Starten Sie eine neue Bash und beenden Sie anschließend den Bash-Prozess aus einem anderen Terminal heraus. PID der alten Bash mit ps-Kommando herausfinden: ps – ef kill
Legen Sie eine Datei mit dem einfachen Beispiel-Skript von oben ´(”Servus Li- nux!”) als Inhalt an und bringen Sie es zum Ablauf. Notieren Sie die erforderli- chen Aktionen, um das Programm zum Ablauf zu bringen. vi servus.sh Folgende Zeilen eintragen: #!/bin/bash echo “Servus Linux!“ Datei sichern und vi beenden mit ESC :wq Datei ausführbar machen „chmod +x servus.sh“ und danach mit „./servus.sh“ ausführen.
Schreiben Sie ein einfaches Bash-Skript, in dem Sie zwei Parameter übergeben und im Skript auf dem Bildschirm ausgeben. Bringen Sie das Skript zum Laufen. #!/bin/bash if [ $# - eq 2 ]; then echo “Sie haben zwei Parameter angegeben:“ echo „Parameter 1: $1“ echo „Parameter 2: $2“ echo „keine weiteren Parameter vorhanden“ else echo “Bitte zwei Parameter uebergeben!“ fi
Ein weiterer hilfreicher Befehl lautet bash - x
echo "Bitte nur 5 Parameter angeben" fi Alternative 1: #!/bin/sh if [ $# - le 5 ]; then for (( i=$#; i>0; --i )) do if test ${!i} == 1 - o ${!i} == 2; then echo "Wert ist ${!i}" fi done fi Ergänzung: Das ginge auch mit While-Schleife #!/bin/sh if [ $# - le 5 ]; then while test $# - gt 0 do if [ $1 == 1 - o $1 == 2 ]; then echo "Wert ist $1" fi shift done fi
Schreiben Sie ein kleines Bash-Script, das in einer while-Schleife einen Zähler von 1 bis 20 zählt und jeweils den aktuellen Zählerwert auf den Bildschirm ausgibt. #!/bin/bash COUNT= while [ $COUNT – le 20 ] do
echo “Zähler: $COUNT“ COUNT=expr $COUNT + 1
done Alternative zum Hochzählen: COUNT=$((COUNT + 1))
Entwickeln Sie ein Bash-Skript, mit dem Dateinamen mvprot.sh. Es soll im aktu- ell gewählten Verzeichnis alle Dateien mit der angegebenen Endung in ein neu erstelltes Unterverzeichnis verschieben und die Anzahl der verschobenen Dateien sowie deren Namen – falls gewünscht – in eine Protokolldatei im Quellverzeichnis schreiben. Das Skript besitzt also die drei Parameter Dateiendung, Name des Unter- verzeichnisses und ein Flag für die Auswahl, ob ein Protokoll über den Vorgang erstellt werden soll. Zum Entwickeln und Testen Ihrer Lösung legen Sie sich bitte ein neues Verzeichnis mit einigen Testdateien an. #!/bin/bash #Protokollierung if [ "$3" = "J" ] ; then ls *.$1 | wc – w > mvprot.log echo “Dateien in $2 verschoben.” ls *.$1 > mvprot.log fi mkdir $ mv *.$1 $
Versuchen Sie nun, Ihr Shell-Skript so zu erweitern, dass eine Prüfung der überge- benen Parameter stattfindet. Zudem soll überprüft werden, ob das zu erstellende Verzeichnis bereits existiert. In diesem Fall soll dem Anwender eine entsprechende Fehlermeldung ausgegeben werden Ferner ist gefordert, eine Hilfefunktion zu implementieren, die eine kurze Be- schreibung des Programms und der möglichen Parameter liefert. Als dritte Erwei- terung soll überprüft werden, ob Dateien mit der übergebenen Änderung existie-
echo "Defaultwert=N" protokollierung="N" fi #Überpruefung ob Verzeichnis bereits vorhanden if [ - d $verzeichnis ] ; then echo "Verzeichnis $verzeichnis vorhanden" else echo "Verzeichnis $verzeichnis noch nicht vorhanden --> wird erstellt" mkdir $verzeichnis fi #Ermittlung der Anzahl der zu verschiebenden Dateien anzahl=$(ls .$dateiendung | wc - w) if [ $anzahl - eq 0 ] ; then echo "Keine Dateien mit Endung $dateiendung zu verschieben" exit 2 fi #Protokollierung if [ $protokollierung = "J" ] || [ $protokollierung = "Y" ] ; then echo "Anzahl Dateien nach $verzeichnis verschoben: $anzahl" > $protokoll echo "Dateien: " >> $protokoll ls .$dateiendung >> $protokoll fi #Dateien werden verschoben mv .$dateiendung $verzeichnis echo " Programm erfolgreich beendet! ***" exit 0
Hinweis. Diese Übung ist für Fortgeschrittene gedacht und optional! Erweitern Sie das vorgegebene Bash-Skript, welches das zu den Übungen beigeleg- te Java-Programm Fakultaet.java zur Berechnung von Fakultäten übersetzt, ein Jar-File mit der Klasse Fakultaet.class erzeugt und anschließend das Pro- gramm aus der Jar-File heraus startet. Alle Fehlersituationen sind abzufangen und entsprechend mit Meldungen zu kommentieren. Bitte beachten Sie, dass Sie so-
wohl bei der Übersetzung als auch beim späteren Starten des Programms noch Fremdbibliotheken benötigen. Das Java-Programm erwartet eine Zahl x, mit 0 ≤ x ≤ 20 , als Eingabeparameter. Der benötigte Eingabeparameter für das Programm ist im Skript einzulesen und auf Plausibilität zu prüfen. Nur wenn der eingegebene Wert korrekt ist, darf das Java-Programm aufgerufen werden. Nutzen Sie in Ihrem Skript die bereits vorhandenen Bash-Funktionen. Sie können auch Bash-Befehle nutzen, die im Skriptum nicht besprochen wurden. Im Bash-Skript sind die evtl. benötigten Umgebungsvariablen JAVA_HOME, CLASSPATH und PATH geeignet zu belegen. Prüfen Sie die Returnwerte der aufgerufenen Programme javac und jar und geben Sie je nach Erfolgs- oder Fehlerfall folgende Exit-Codes zurück:
function compile_code() { if [! - d ${BIN_DIR} ]; then mkdir ${BIN_DIR} fi javac - d ${BIN_DIR}/ - sourcepath ${JAVA_SRC_DIR}/ @${SRC_FILES} }
function make_jar_file() { jar cvfm ../${JAR_FILE_NAME}.jar ../${MANIFEST_FILE} * RET_VAL=${?} if [ ${RET_VAL} - ne 0 ]; then echo "Error during JAR Create Process. Check Code or Dependencies and run Script again!" exit 2 fi }
function prepare_and_make_jar() { if [! - d ${TMP_DIR} ]; then mkdir ${TMP_DIR} fi cp - r ${BIN_DIR}/* ${TMP_DIR} cp - r ${RES_SRC_DIR}/* ${TMP_DIR} cd ${TMP_DIR} make_jar_file cd .. }
function cleanup() { rm - rf ${BIN_DIR} rm - rf ${TMP_DIR} rm - rf ${LOGS_DIR}
rm ${JAR_FILE_NAME}.jar rm ${SRC_FILES} } echo "Shell Script to compile JAVA Source Files to Byte Code and make JAR File" check_needed_progs echo "" echo "Find Source Files" find_source_files cat ${SRC_FILES} echo "" echo "compile Code" set_classpath compile_code RET_VAL=${?} if [ ${RET_VAL} - ne 0 ]; then echo "Error during Compile Process. Check Code and run Script again!" exit 1 fi echo "" echo "Do preparations and make JAR File" prepare_and_make_jar unset CLASSPATH echo "" echo "" echo "" echo "****** Faculty calculation ******" if [ - e "${JAR_FILE_NAME}.jar" ]; then
read - p "Please enter a Number x 0 <= x <= 20 for Faculty calculation: " NUMBER
echo "Eingegebene Zahl: ${NUMBER}"