Shell-Workshop, Teil 3

Aus LinuxUser 04/2017

Shell-Workshop, Teil 3

© Womue, Fotolia

Ordnung schaffen

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

Teil 1

LU 02/2017, S. 46

https://www.linux-community.de/38040

Teil 2

LU 03/2017, S. 60

https://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"

Text- und PDF-Dateien durchsuchen

Mittels Grep durchsuchen Sie Textdateien, mit Pdfgrep stattdessen PDF-Dokumente. Beide Programme liefern grundsätzlich den Exitcode 0 bei einem Treffer und 1, falls sie nichts Passendes finden. Die Tabelle “Suchaktionen” fasst die wichtigsten Optionen beider Programme zusammen.

Grep

Pdfgrep

Aktion

-q

-q

ohne Bildschirmausgabe

-m Zahl

-m Zahl

maximale Trefferzahl

-l

-

nur Dateinamen mit Treffern anzeigen

-L

-

nur Dateinamen ohne Treffer anzeigen

-h

-h

Anzeige von Dateinamen unterdrücken

-H

-H

zusätzlich Dateinamen zum Treffer anzeigen

-n

-

Zeilennummer des Treffers ausgeben

-

-n

Seitennummer des Treffers ausgeben

-c

-c

Zahl der Treffer ausgeben

-v

-

Inverssuche

Listing 4 zeigt, wie Sie Grep in ein Skript einbinden. Die in dem Skript verwendete Textdatei datei1.txt erzeugt das Skript selbst und löscht sie am Schluss auch wieder. Sie besteht lediglich aus zwei nummerierten Zeilen.

Listing 4

#!/bin/bash
# Testdatei erzeugen
echo -e "Zeile 1\nZeile 2" > datei1.txt
echo "-------"
cat datei1.txt
echo "-------"
# Suchbegriff: einstellige Zahl
read -n1 -p "einstellige Zahl eingeben: " a
# Durchsuchen und Folgerung
echo ""
cat datei1.txt | grep -q "$a"
if [ $? -eq 0 ]; then
  echo "Zahl" $a "ist vorhanden"
else
  echo "Zahl" $a "nicht gefunden"
fi
rm -r datei1.txt

Unterschiede ermitteln

Mit dem Werkzeug Diff ermitteln Sie Unterschiede zwischen zwei Textdateien. Das Tool verfügt über einige interessante Optionen, die die Tabelle “Diff-Optionen” zusammenfasst. Der Exit-Code 0 zeigt an, dass die verglichenen Dateien identisch ausfallen, 1 meldet Differenzen.

Option

Aktion

-q

Ausgabe der Unterschiede unterdrücken

-i

Groß/Kleinschreibung ignorieren

-Z

führende Leerstellen ignorieren

-E

Tabulatoren ignorieren

-w

alle Leerstellen ignorieren

-B

Leerzeilen ignorieren

Das in Listing 5 gezeigt Skript legt zunächst die beiden nahezu identischen Files A-Datei und B-Datei an (siehe Tabelle “Datensätze”). Beide weisen dieselbe Größe auf – auf diesem Weg lässt sich also kein Unterschied feststellen.

A-Datei

B-Datei

Hans

Hans

Christian

Christian

Anna

Bert

Maria

Maria

Zuerst vergleicht das Skript die beiden Datensätze durch einen Aufruf von diff (Zeile 6). Dann erstellt es unter dem Namen C-Datei eine Kopie von A-Datei (Zeile 14), die es anschließend mit dem Original vergleicht (Zeile 17). In der Ausgabe sehen Sie also die Ergebnisse von Diff sowohl für unterschiedliche (A vs. B) sowie identische (A vs. C) Dateien.

Zu guter Letzt entsorgt das Skript die nun überflüssigen Testdateien wieder (ab Zeile 25).

Listing 5

#!/bin/bash
echo -e "Hans\nChristian\nAnna\nMaria" > A-Datei
echo -e "Hans\nChristian\nBert\nMaria" > B-Datei
echo -e "Vergleich von A-Datei und B-Datei"
diff -q A-Datei B-Datei
if [ $? -eq 0 ]; then
  echo "Dateien A-Datei und B-Datei sind identisch."
else
  echo ""
fi
# Kopieren A-Datei -> C-Datei
cp A-Datei C-Datei
echo -e "Vergleich von A-Datei und C-Datei"
diff -q A-Datei C-Datei
if [ $? -eq 0 ]; then
  echo "Dateien A-Datei und C-Datei sind identisch."
else
  echo ""
fi
# Aufräumen
for datei in A B C; do
  rm -r $datei-Datei
done

Texte verarbeiten

Wer häufig mit Texten in der Shell arbeitet, der weiß eine Reihe von kleinen Helfern rasch zu schätzen, die als Spezialisten auf reinen Textdateien arbeiten. Für die Beispiele kommt die strukturierte Datei Adressen.txt zum Einsatz (Listing 6).

Listing 6

Bayer:Anton:Hauptstraße 5:99998:Nirgendwo:25
Baier:Franz:Nebenstraße 10:99997:Auchwo:10
Müller:Karl:Rue d'Han Tien 99:93047:Ratisbonne:3
Meier:Maria:Querstraße 18:99998:Nirgendwo:43
Maier:Martina:Kreuzstraße 109:99997:Auchwo:9

Wie man unschwer erkennen kann, verhalten sich die Zeilen in den Dateien wie Datensätze, deren einzelne Felder jeweils ein bestimmtes Zeichen voneinander trennt. Mit dem Befehl cut schneiden Sie die einzelnen Felder im wortwörtlichen Sinn aus.

Die Optionen des Befehls finden Sie in der Tabelle “Cut-Optionen”. Die Ausgabe von Datenfeldern (-fFelder) erfolgt in der gleichen Reihenfolge, in der diese in der Zeile stehen. Möchten Sie davon abweichen, verwenden Sie entweder Awk oder belegen verschiedene Variablen mit jeweils einem Datenfeld.

Aktion

Option

-dTrennzeichen

Feldtrenner angeben

-fFelder

Angabe der Felder

-s

Zeilen ohne Felder auslassen

-bBytes

Angabe der Bytes

-cZeichen

Angabe der Zeichen

Das Listing 7 zeigt einige Funktionsbeispiele, wobei auch die Umlaute-Problematik zum Tragen kommt: In der UTF-8-Kodierung sind Umlautzeichen mehrere Bytes lang. Das führt dazu, dass bei der Ausgabe der ersten drei Bytes aus einem “Maier” zwar ein “Mai” wird, ein “Müller” aber zum “Mü” verkommt.

Listing 7

#!/bin/bash
# Ausgabe von Name, Vorname und Ort
cut -d\: -f1,2,5 < Adressen.txt
echo "-"
# Ausgabe der ersten 3 Bytes
cut -b1-3 < Adressen.txt
echo "-"
# Ausgabe der ersten 3 Zeichen
cut -c1-3 < Adressen.txt

Mit Awk Zeilen trennen

Anders als bei Cut geben Sie mithilfe des Tools Awk die Spalten einer strukturierten Textdatei wahlfrei aus. Das Trennzeichen definieren Sie dabei mit -FTrenner. Das Skript in Listing 8 zeigt den Gebrauch des Werkzeugs für diesen Einsatzbereich.

Sie sprechen dabei die Felder über deren Position im Datensatz an: Dabei steht $1 für das erste Feld, $2 für das zweite und so weiter. Die Variable $0 enthält den kompletten Datensatz.

Listing 8

#!/bin/bash
# Darstellung einzelner Spalten aus einer
# strukturierten Textdatei mittels awk
awk -F\: '{ print $2" "$4" "$1 }' Adressen.txt

Textdateien zerlegen

Neben den Tools, die auf den Zeilen wie auf einem Datensatz arbeiten, gibt es solche, die Textdateien zeilenweise manipulieren. Diese Programme geben einzelne Zeilen oder Bereiche einer Textdatei aus. Mit head -Zeile geben Sie entsprechend dem Wert von Zeile eine definierte Anzahl von Zeilen vom Anfang einer Datei aus, mit tail -Zeile klappt das vom Ende der Datei aus.

Kombinieren Sie beide, besteht die Möglichkeit, sogar gezielt eine einzige Zeile auszuwählen. Dazu gehen Sie vom Kopf her mit head heran und geben als Zahl die Zeile an, die Sie benötigen. Mittels tail -1 in der Pipe unterdrücken Sie dann alle anderen Zeilen.

Dieses Beispiel mag zwar wegen zweier benötigter Befehle umständlich erscheinen, aber die einfache Syntax gleicht den Nachteil sicher wieder aus (Listing 9). Das Programm hat die Aufgabe, die dritte Zeile unserer Adressdatei mit den Daten von Herrn Müller wiederzugeben.

Listing 9

#!/bin/bash
# Auslesen der dritten Zeile
head -3 < Adressen.txt | tail -1

Alternativ nutzen Sie den Stream-Editor Sed zum Ausschneiden von Zeilen. Damit sprechen Sie die gewünschte Zeile direkt an (Listing 10). Als Parameter übergeben Sie einen Bereich von Zeilen, in unserem Beispiel von Zeile 3 bis Zeile 3. Außerdem erwartet Sed eine Handlungsanweisung, in unserem Fall eine Ausgabe (p, “print”).

Listing 10

#!/bin/bash
# Holen der Zeile 3 mit sed
sed -ne '3,3p' Adressen.txt

Suchen und Ersetzen

Einzelne Zeichen oder ganze Zeichenklassen löschen oder ersetzen Sie mit dem Befehl tr. Die entsprechende Option lautet -d. Die Klassen, die Sie dabei verwenden dürfen, finden Sie in der Tabelle “Zeichenklassen”.

Klasse

Zeichen

[:alnum:]

alphanumerische Zeichen

[:alpha:]

Buchstaben

[:cntrl:]

Steuerzeichen

[:digit:]

Zahlen

[:graph:]

Grafikzeichen

[:lower:]

Kleinbuchstaben

[:print:]

druckbare Zeichen

[:punct:]

Satzzeichen

[:space:]

Leerzeichen

[:upper:]

Großbuchstaben

[:xdigit:]

Hexadezimalzahlen

Listing 11 zeigt den Einsatz des Tools in der Praxis. Shell-Skripte für den Zugriff auf Datenbanken oder zum Erfassen von Daten benötigen oft eine Funktion, um den Dezimaltrenner gegen ein Komma auszutauschen. Das erlaubt numerische Eingaben mit dem Ziffernblock der Tastatur. Feldtrennern und anderen Sonderzeichen maskieren Sie mittels Backslash (\).

Listing 11

#!/bin/bash
# Dezimaltrenner tauschen
# als Funktion
dezimal () {
  a=$(echo $a | tr \. \,)
}
a=12.34
echo " Vor Funktion: $a"
dezimal
echo "Nach Funktion: $a"
echo "-"
# Feldtrenner durch Tabulatoren ersetzen
tr \: \\t < Adressen.txt
echo -e "\n--"
# Umstellung auf Großschreibung, Methode mit
# Zeichendefinitionen, nur erste Zeile wird
# ausgegeben, Sonderbehandlung ß
head -1 < Adressen.txt | tr a-zäöü A-ZÄÖÜ | tr ß SS
echo "---"
# Umstellung auf Großschreibung,
# kürzere Methode, nur erste Zeile
# wird ausgegeben, Sonderbehandlung ß
head -1 < Adressen.txt | tr [:lower:] [:upper:] | tr ß SS
echo "----"
# Löschen eines Zeichens, hier ":"
head -1 < Adressen.txt | tr -d \:

Mit Sed suchen und ersetzen

Der Stream-Editor, kurz Sed, arbeitet als Filter. Dabei beherrscht er die grundsätzlichen Operationen zum Suchen, Ersetzen, Anfügen und Löschen, die Sie bei Bedarf kombinieren. Das Programm agiert weder interaktiv, noch kann es Dateien zum Lesen und Bearbeiten öffnen.

Ein typischer Sed-Befehl liest sich auf den ersten Blick etwas kryptisch. Zudem ist das Konzept als solches anfangs gewöhnungsbedürftig, da die Syntax vom üblichen Baukastensystem der Shell-Befehle abweicht. Die Tabelle “Sed-Operationen” zeigt zusammenfassend alles Wichtige.

Befehl/Option

Wirkung

-e

Bearbeiten

-n

Ausgabe der restlichen Daten während des Verarbeitens unterdrücken

-f

Angabe einer Skript-Datei

Editier-Anweisungen

'Zeilennummerd'

Löschen

s'/Alt/Neu/s-Anweisung'

Suchen und Ersetzen

'/Suchbegriff/p'

Suchen

'Zeilennummer,Zeilennummerp'

Ausgeben nach Zeilennummer

Zusatzanweisung für Suchen und Ersetzen

g

Ersetzen aller übereinstimmender Suchmuster

p

Ausgabe des geänderten Puffers

wDatei

Ergebnis in Datei schreiben

Listing 12 zeigt einige Beispiele aus der Praxis. Zum einen ist wieder der Tausch Punkt gegen Komma Thema, eine Aufgabe, die Sie in Listing 11 mittels Tr erledigt haben. Diese Anwendung fungiert auch in diesem Skript wieder als Funktion.

Darüber hinaus sehen Sie den Tausch eines Feldtrenners. Gerade beim Arbeiten mit CSV-Dateien und Skripten für Datenbanken erledigen Sie auf diese Weise viele Vorgänge. Als letzte Aufgabe löscht das Skript ein Zeichen.

Listing 12

#!/bin/bash
# Dezimaltrenner austauschen als Funktion.
# Punkt muss für Sed als Sonderzeichen
# entwertet werden.
dezimal () {
  a=$(echo $a | sed s'/\./,/g')
}
a=12.34
echo " Vor Funktion: $a"
dezimal
echo "Nach Funktion: $a"
echo "-"
# Feldtrenners gegen Tabulatoren tauschen
sed s'/\:/\t/g' Adressen.txt
echo -e "\n--"
# Löschen eines Zeichens, hier ":"
head -1 < Adressen.txt | sed s'/\://g'

Text sortieren

Gerade im Zusammenhang mit CSV-Dateien, Datenbanken und mit dem Befehl uniq, mit dem Sie mehrfach vorkommende, identische Zeilen filtern, benötigen Sie den Befehl sort: Er bringt das Ausgangsmaterial in einem ersten Schritt in eine geordnete Form. Die Tabelle “Sort-Optionen” zeigt einige der umfangreichen Möglichkeiten.

Option

Aktion

-b

führende Leerzeichen ignorieren

-c

prüfen, ob Datei bereits sortiert ist

-f

Groß/Kleinschreibung ignorieren

-m

sortierte Dateien zusammenführen

-o Datei

Ergebnis in Datei umleiten

-r

in umgekehrter Reihenfolge sortieren

-n

numerisch sortieren

-t'Trenner'

Angabe des Feldtrenners

-u

mehrfach vorhandene Zeilen nur einmal ausgeben

Listing 13 zeigt drei Beispiel: Zunächst sortiert das Skript die Adressdatei alphanumerisch aufsteigend, anschließend rückwärts. Im dritten Beispiel sehen Sie, wie Sie bei strukturierten Textdateien eine Spalte angeben, die als Sortierkriterium dient. Dazu müssen Sie zusätzlich den Feldtrenner benennen.

Listing 13

#!/bin/bash
echo "Normal sortiert:"
sort < Adressen.txt
echo "--------------------"
echo "umgekehrt:"
sort -r < Adressen.txt
echo "--------------------"
echo "nach Nummer (Feld 6)"
sort -t':' -n -k6 < Adressen.txt
echo "--------------------"

Zeilen nummerieren

In einigen Fällen kann der Bedarf entstehen, die Zeilen von Textdateien zu nummerieren. Das erledigen Sie mittels nl. Die Tabelle “Nl: Optionen” führt die wichtigsten Optionen auf, Listing 14 zeigt einige Praxisbeispiele. Im Alltag versehen Sie damit vorsortierte Dateien mit eindeutigen Zeilennummern. Das hilft vor allem dann, wenn Sie über diverse Suchfunktionen gezielt einzelne Zeilen ansprechen müssen.

Aktion

Option

Schalter

Numeriert gemäß [UMFANG]

-b[UMFANG]

a = alle Zeilen, t = nur Zeilen mit Inhalt, n = keine Zeilen

Numeriert mit [FORMAT]

-n[FORMAT]

ln = linksbündig, rn = rechtsbündig, rz = rechtsbündig, führende Nullen

Trennzeichen

-s[TRENNZEICHEN]

Startwert

-v[STARTWERT]

Inkrement

-i[INKREMENT]

Listing 14

#!/bin/bash
# Alle Zeilen nummerieren, auch Leerzeilen
# Standard: rechtsbündig (-nrn)
nl -ba < Adressen.txt
# Alle Zeilen linksbündig nummerieren
nl -ba -nln < Adressen.txt
# Alle Zeilen rechtsbündig nummerieren,
# führende Nullen, Trennzeichen = |
nl -ba -nrz -s'|' < Adressen.txt
# Alle Zeilen nummerieren,
# erste Zeile=10, Schrittweite = 20
nl -v10 -i20 < Adressen.txt

Identische Zeilen

Zusammen mit Sort setzen Sie das Kommando uniq ein, um doppelt vorhandene Zeilen zu erkennen und zu behandeln. Das Tool erwartet die mehrfach vorhandenen, identischen Zeilen stets direkt aufeinander folgend – daher die Kombination mit Sort. Die wichtigsten Optionen fasst die Tabelle “Uniq-Optionen” zusammen.

Aktion

Option

-c

Vorkommen zählen

-d/-D

nur mehrfach vorhandene Zeilen ausgeben

-u

nur einfach vorkommende Zeilen ausgeben

-i

Groß/Kleinschreibung ignorieren

-zZahl

nur Zahl Zeichen je Zeile vergleichen

Als Datensatz für die Beispiele dient die Datei einzigartig.txt, die Sie in Listing 15 sehen. Das Beispiel aus Listing 16 zeigt Ihnen verschiedene Abläufe. Interessant für die Praxis ist das Umkehren des Befehls, nämlich nur einfach vorhandene Zeilen auszugeben. Auch das Ignorieren der Groß- und Kleinschreibung erweist sich oft als hilfreich.

Listing 15

a
A
C
D

Listing 16

#!/bin/bash
# Aufruf ohne Sortierung
uniq < einzigartig.txt
echo "-------------"
# Vorsortierung, Schreibweise
# ignorieren, Vorkommen zählen
sort -f < einzigartig.txt | uniq -ic
echo "-------------"
# Ausgabe mehrfach vorhandener Zeilen
sort -f < einzigartig.txt | uniq -id
echo "-------------"
# Ausgabe einfach vorhandener Zeilen
sort -f < einzigartig.txt | uniq -iu

Zusammenfügen

Mit cat fügen Sie Textdateien seriell, also hintereinander zusammen. Wenn Sie dabei für die Dateinamen nur * angeben, erfolgt die Reihung in deren alphanumerischen Reihenfolge. Möchten Sie das Ergebnis in eine neue Datei schreiben, lenken Sie dazu die Ausgabe um.

$ cat DATEI1 DATEI2 .... > neu.txt
$ cat *.txt > neu.txt

Mit paste fügen Sie Dateien spaltenweise zusammen. Das setzt voraus, dass die Quelldateien dieselbe Länge haben. Bei Bedarf überprüfen Sie dies mit wc -l in einem Terminal. Anschließend sorgen Sie dafür, dass die Daten entsprechend sortiert sind. Die Eingabe paste -s Datei1 Datei2 > neu.txt setzt die Dateien in der Form zusammen, dass jede Datei eine Spalte bildet.

Fazit

Neben den eingebauten Funktionen der Bash stehen eine Vielzahl von weiteren Tools bereit, die sich aber zum größten Teil nahtlos in Skripte integrieren. Wer sich mit den kleinen Helfern einmal genauer beschäftigt hat, der schreckt selbst vor komplexen Operationen nicht zurück. Der klare Fokus der einzelnen Tools erleichtert es dabei, diese untereinander zu kombinieren und trotzdem den Überblick über die verschiedenen Operationen zu behalten. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 04/2017 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Markus
9 Jahre her

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

Nach oben