AA_PO-21786_Womue-Fotolia.jpg

© Womue, Fotolia

Shell-Workshop, Teil 3

Ordnung schaffen

Kleine Shell-Tools helfen in vielen Alltagssituationen. Unser Kurs stellt die wichtigsten Kommandos vor.

Shell-Kurs

Teil 1 LU 02/2017, S. 46 http://www.linux-community.de/38040
Teil 2 LU 03/2017, S. 60 http://www.linux-community.de/38291

Shell-Skripte übernehmen nicht nur Aufgaben, die sich auf die Arbeit mit Dateien oder Datenströmen beziehen. Sie bieten darüber hinaus die Möglichkeit, Berechnungen anzustellen und so Werte arithmetisch zu verarbeiten.

Die grundlegenden Rechenarten stehen über einfache Operatoren bereit. Dabei steht das Pluszeichen + für die Addition, das Minus - für die Subtraktion, der Asterisk * für die Multiplikation und der Schrägstrich / für die Division.

Operationen mit ganzen Zahlen erfordern es, dass Sie den Ausdruck in doppelte Klammern setzen. Es gelten die Regeln "Klammern zuerst" und "Punkt-vor-Strich" (Listing 1).

Listing 1

#!/bin/bash
a=2
b=3
# Ergebnis sofort Variablen zuweisen
c=$(( 2 + 8 ))
echo $c
echo $(( $a * $a ))
echo $(( $c / 5 ))
echo $(( $a - $c ))

Berechnungen mit Bc

Genaue Berechnungen, selbst mit 1000 Nachkommastellen, ermöglicht das Kommandozeilen-Tool Bc. Dabei geben Sie die Anzahl der zu berücksichtigenden Nachkommastellen über die Anweisung scale=Anzahl vor.

Neben den vier Grundrechenarten beherrscht das Programm unter anderem auch die Anweisung sqrt(Wert) zum Berechnen der Quadratwurzel. Mit den Angaben ibase=Zahl beziehungsweise obase=Zahl wählen Sie das Zahlensystem (dual, dezimal, oktal, sedezimal) für die Ein- respektive Ausgabe.

Bc verfügt über einen interaktiven Modus, es eignet sich aber auch für Skripte. Wie in der Shell trennen Sie auch im interaktiven Betrieb die Kommandos mittels Semikolon (;) voneinander ab. Ergibt das Ergebnis keine führende Stelle vor dem Komma, so gibt das Tool keine führende Null aus. Das gilt es beim weiteren Verarbeiten unter Umständen zu berücksichtigen. Listing 2 zeigt einige Berechnungen.

Listing 2

#!/bin/bash
a=100
b=0
c=0
# Summen und Differenzen
for i in 20.32 -49.57 81.62; do
  b=$(echo "$b + $i" | bc)
  c=$(echo "$c - $a - $i" | bc)
done
echo $b
echo $c
# Multiplikation mit Rundung
h=$(echo "scale=50;45.48 * 0.458" | bc)
echo "ungerundetes Ergebnis: $h"
# Bc kürzt auf drei Nachkommastellen
echo -n "Auf drei Nachkommastellen abgeschnitten: ";
echo "scale=3;45.48 * 0.458" | bc
# aber mit Rundung durch printf:
printf "Ausgabe $h mit 'printf': %10.3f \n" $h
# Division, Vor- und Nachkommastellen setzen
for i in -639/852 -852/639 639/852 852/639; do
  m=$(echo "scale=10;$i" | bc)
  # Printf setzt fehlende Null bei der Ausgabe
  echo -n "Ausgabe bc: $m   ";
  printf "Ausgabe mit 'printf': %10.2f \n" $m
done
# Quadratwurzel
printf "Wurzel aus 99, fünfstellig: %10.5f \n" $(echo "scale=50;sqrt(99)" | bc)

Funktionen und Berechnungen

Das Shell-Skript aus Listing 3 zeigt das Zusammenspiel von Funktionen und Berechnungen, als Ergebnis liefert es eine Tabelle zurück. Jede Zeile enthält dabei Prozentwerte zur Basis 125, beginnend mit 1 und endend mit 20 Prozent. Anschließend gibt das Skript das Wort Fertig aus.

Dabei gibt es noch zwei Besonderheiten: Die Schleife zum Berechnen der Werte steht in einer Funktion (siehe Teil 2 dieses Workshops). Jede Zeile enthält neben dem Prozentsatz den eigentlichen Wert. Dabei kommt Printf zum Einsatz, das ebenfalls im letzten Teil des Workshops Thema war.

Listing 3

#!/bin/bash
a=125
n=0
prozenttabelle () {
  while true; do
    n=$(( $n + 1 ))
    printf "Ergebnis für $n v.H.: %10.2f \n" $(echo "scale=50;$a/100*$n" | bc)
    if [ $n -eq 20 ]; then
      break
    fi
  done
}
prozenttabelle
echo "Fertig"

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Verschlungene Pfade
    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.
  • Mehr Komfort
    Von einfachen Abfragen bis hin zu komplexen Menüs: Mit dem Toolkit Dialog bauen Sie eine grafische Oberfläche für Shell-Skripte, die oft nicht mehr als eine zusätzliche Zeile brauchen.
  • Einführung in die Bash-Programmierung
    Skripte sollen meist wiederkehrende oder lästige Arbeiten automatisieren. Die Standard-Shell Bash stellt Ihnen dazu eine ganze Reige von Funktionen bereit. Dieser Artikel erklärt, wie Sie ihre eigenen Shell-Skripte schreiben.
  • Kreislauf
    Schleifen ermöglichen das mehrmalige Abarbeiten von Anweisungen. Dabei kann das begrenzende Ereignis sowohl außerhalb als auch innerhalb der Schleife liegen.
  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
Kommentare
Anmerkung zu $(( ... )) in der bash
Markus (unangemeldet), Sonntag, 19. März 2017 22:47:52
Ein/Ausklappen

Die Variablen innerhalb der doppelten Klammern müssen nicht nochmals mit $ angegeben werden, die bash verträgt auch direkt den Namen:

i=5
echo $((i*2))



Bewertung: 162 Punkte bei 6 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Infos zur Publikation

LU 07/2017: VIDEOSCHNITT

Digitale Ausgabe: Preis € 0,00
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Aktuelle Fragen

scannen mit LINUXMINT 18.0 - Brother DCP - 195 C
Christoph-J. Walter, 21.06.2017 08:47, 4 Antworten
Seit LM 18.0 kann ich nicht mehr direkt scannen. Obwohl ich die notwendigen Tools von der Brothe...
Anfänger Frage
Klaus Müller, 24.05.2017 14:25, 2 Antworten
Hallo erstmal. Habe von linux nicht so viel erfahrung müsste aber mal ne doofe frage stellen. A...
Knoppix-Live-CD (8.0 LU-Edition) im Uefiboot?
Thomas Weiss, 26.04.2017 20:38, 4 Antworten
Hallo, Da mein Rechner unter Windows 8.1/64Bit ein Soundproblem hat und ich abklären wollte, o...
Grub2 reparieren
Brain Stuff, 26.04.2017 02:04, 7 Antworten
Ein Windows Update hat mir Grub zerschossen ... der Computer startet nicht mehr mit Grub, sondern...
Linux open suse 2,8
Wolfgang Gerhard Zeidler, 18.04.2017 09:17, 2 Antworten
Hallo.bitte um Hilfe bei. Code fuer den Rescue-login open suse2.8 Mfg Yvo