Bash Programmierung: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Link auf Zeiten I. umgestellt
 
(52 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Bash Basics=
=Allgemeines=
*[[Einfache Shellsonderzeichen]]
*[[Thomas Will]]
*[[Bash Eingabe/Ausgabe]]
*[[Zeiten I.]]
*[[Jokerzeichen]]
=Themen=
*[[Prinzip der Bash]]
*[[Bash Programmierung Inhalt]]
*[[Interpretator]]
<!-- == Tag 1 == -->
*[[Ablauf eines Shell-Skriptes]]
* [[Die Geschichte der Shells]]
*[[Möglichkeiten ein Shellskript aufzurufen]]
* [[Ziele des IT Trainings Bash Programmierung]]
*[[Bash Variablen]]
* [[Arten von Shells]]
*[[Bash Dateien]]
* [[Prinzip der Bash]]
*[[Here Dokument]]
* [[Unterschiede zwischen bash und powershell]]
*[[read-Kommando]]
* [[Skript Interpreten in Linux]]
*[[Einfache Verzweigungen]]
* [[Möglichkeiten ein Shellskript aufzurufen]]
*[[Endestatus]]
* [[Bash Eingabe, Ausgabe und Pipes]]
*[[test-Kommando]]
* [[Einfache Shellsonderzeichen]]
*[[Optionen der Bash]]
* [[Jokerzeichen/Wildcard]]
*[[Bash Der if-Block]]
* [[Ein paar Kommandos]]
*[[Bash Der case-Block]]
* [[Kommandolokalisierung]]
*[[Rechnen mit der Bash]]
* [[Bash ssh in Programmen nutzen]]
*[[Bash Die while-Schleife]]
<!-- == Tag 2 == -->
*[[Bash Die until-Schleife]]
* [[Ablauf eines Shell-Skriptes]]
*[[Bash Die for-Schleife]]
* [[Bash Variablen]]
*[[Bash Steuerung der Ablaufanweisungen]]
* [[Bash Dateien]]
*[[bash funktion]]
* [[Here Dokument]]
*[[Bash Signalbehandlung]]
* [[Here String]]
*[[aliase]]
* [[read-Kommando]]
*[[Bash Filedeskriptoren]]
* [[Endestatus]]
*[[Bash Farben]]
* [[Bash Einfache Verzweigungen]]
* [[test-Kommando]]
* [[Bash Das neue Test Kommando]]
* [[Rechnen mit der Bash]]
<!-- == Tag 3 == -->
<!-- == Tag 4 == -->
* [[Bash Der if-Block]]
* [[Bash Der case-Block]]
* [[Bash Die while-Schleife]]
* [[Bash Die until-Schleife]]
* [[Bash Die for-Schleife]]
* [[Bash Steuerung der Ablaufanweisungen]]
* [[Bash funktion]]
* [[cron]]
* [[Bash Signalverarbeitung]]
<!-- == Tag 5 == -->
* [[Bash printf]]
* [[Aliase]]
* [[Prozesse]]
* [[Bash Filedeskriptoren]]
* [[Bash Farben]]
* [[Bash getopts]]
* [[Bash eval]]
* [[Optionen der Bash]]
* [[Bit Operationen mit der Bash]]
* [[Bash Skripte]]
* [[Mail Kommando]]
* [[Bash Passwort generieren]]
* [[Bash Alter eine Datei]]
* [[Ssh VPN]]
* [[Aufgaben gesamt]]


*[[Bash getopts]]
= Links=
 
* http://openbook.rheinwerk-verlag.de/shell_programmierung/
=printf=
* http://mywiki.wooledge.org/BashFAQ/031
Formatierte Ausgabe mit printf
* http://tldp.org/LDP/abs/html/index.html
 
* http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_003.htm
Im einfachsten Fall wird ein fester Text auf dem Bildschirm ausgegeben:
* https://kuepper.userweb.mwn.de/informatik/printf.pdf
*printf("Dies ist ein einfaches Beispiel");
Der Text kann auch Sonderzeichen (z. B. Zeilenumbrüche) enthalten:
*printf("Hier werden \n zwei Zeilen ausgegeben!");
Die Zeichensequenz \n bewirkt einen Sprung an den Anfang der folgenden Bildschirmzeile. Weitere gebräuchliche Sonderzeichen sind:
{| class="wikitable"
|-
|\n
|Sprung an den Anfang der folgenden Bildschirmzeile
|-
|\b
|Gehe ein Zeichen zurück
|-
|\a
|Akustisches Signal
|-
|\r
|Sprung an den Anfang der aktuellen Bildschirmzeile
|-
|\\
|Ausgabe des Gegenschrägstrichs "\" (Backslash)
|-
|%%
|Ausgabe des Prozent-Zeichens "%"
|-
|\"
|Ausgabe eines doppelten Anführungszeichens
|-
|\t
|Sprung zur nächsten Tabulatorposition
|}
Sollen aktuelle Variablenwerte ausgegeben werden, werden in den Aufruf der
 
Funktion printf entsprechende „Platzhalter“ eingefügt:
*int x = 10;
*printf("Der Wert %d wurde der Variablen x zugewiesen.", x);
Auf dem Bildschirm erfolgt die Ausgabe „Der Wert 10 wurde der Variablen x zugewiesen“, es wird also der Platzhalter %d durch den aktuellen Wert der Variablen x
ersetzt. Es ist möglich, mehrere Variablen zugleich auszugeben:
*int x = 123, y = 234;
*printf("x = %d und y = %d", x, y);
Die Ausgabe lautet in diesem Fall „x = 123 und y = 234“. Für jede Variable ist ein
eigener Platzhalter (hier: %d) notwendig. Die auszugebenden Variablen werden
durch Kommas getrennt aufgelistet. Für jeden Platzhalter muss dabei eine Variable angegeben werden (hier: x, y).
Es ist zu beachten, dass der Platzhalter zum Typ der auszugebenden Variablen
passt (z. B. dient %d zur Ausgabe einer Variablen des Typs int, short oder long).
Weitere Platzhalter sind:
 
{| class="wikitable"
|-
|%d, %i
|int, short, long
|Ganze Zahl
|-
|%x, %X
|int, short, long
|Ganze Zahl, Ausgabe als Hexadezimalzahl
|-
|%f
|float, double
|Fließkommazahl
|-
|%e, %E
|float, double
|Fließkommazahl, Ausgabe im Exponentialformat
|-
|%c
|char
|Einzelnes Zeichen (Buchstabe, Ziffer, …)
|-
|%s
|char*
|Zeichenkette („String“)
|}
;Beispiel:
*int i = 10; double d = 22.22; char c = 'X';
*char* str = "abcdefg...";
*printf("Beispiel zu printf:\n");
*printf("%d, %f, %c\n", i, d, c);
*printf("%s", str);
Es kann die Breite des Ausgabebereichs angegeben werden. So wird mit %10d
eine ganze Zahl rechtsbündig in einem Bereich von 10 Zeichen Länge ausgegeben:
int i = 123;
*printf("->%d<-\n", i);
*printf("->%4d<-\n", i);
*printf("->%5d<-\n", i);
Bei der Ausgabe von Fließkommazahlen kann zusätzlich zur Länge des Ausgabebereichs die Anzahl der Nachkommastellen eingestellt werden:
*float f = 123.625;
*printf("->%f<-\n", f);
*printf("->%.2f<-\n", f);
*printf("->%10.0f<-\n", f);
*printf("->%10.1f<-\n", f);
*printf("->%10.2f<-\n", f);
*printf("->%10.3f<-\n", f);
*printf("->%10.4f<-\n", f)
==Beispielskript==
<syntaxhighlight>
#!/bin/bash
for DIR in $(df -t ext4  | awk 'NR>1 {  print $6 }')
do
  PROZENT=$(df -t ext4 $DIR | awk 'NR>1 {  print $5 }')
  PRO=$(echo $PROZENT | tr -d "%")
  let KI=PRO*20/100
  let MI=20-KI
    K="####################"
    M='--------------------'
  printf "%-10s%-4s%.${KI}s%.${MI}s" $DIR $PROZENT $K $M
    echo
done
</syntaxhighlight>
==Links==
*https://linuxconfig.org/bash-printf-syntax-basics-with-examples
 
=Das neue Test Kommando=
*"[[" ist Bashs Verbesserung des "[" Befehls.
*Es ist die bessere  Wahl, wenn Sie Skripte schreiben, die auf Bash abzielen. Meine Favoriten sind:
*Es ist eine syntaktische Funktion der Shell, daher weist sie ein besonderes Verhalten auf, das "[" nicht hat.
*Variablen müssen nicht mehr quotiert werden, da leere Zeichenfolgen und Zeichenfolgen mit Leerzeichen intuitiver behandelt werden.
*Zum Beispiel müssen Sie mit "[" schreiben.
<pre>
if [ -f "$ FILE"]
</pre>
*um leere Zeichenfolgen oder Dateinamen mit Leerzeichen richtig zu behandeln. Mit "[[" sind die Anführungszeichen unnötig:
<pre>
if [[ -f $ FILE ]]
</pre>
*Da es sich um eine syntaktische Funktion handelt, können Sie && und || verwenden Operatoren für Boolesche Tests und <und> für Zeichenfolgenvergleiche.
*[ kann dies nicht tun, da es sich um einen regulären Befehl handelt und &&, ||, <und> nicht als Befehlszeilenargumente an reguläre Befehle übergeben werden.
 
*Es hat einen wunderbaren Operator = ~, um Übereinstimmungen mit regulären Ausdrücken zu erstellen. Mit [ könntest du schreiben
<pre>
if ["$ ANSWER" = y -o "$ ANSWER" = yes]
</pre>
*Mit [[ können Sie dies als schreiben
<pre>
if [[ $ ANSWER = ~ ^ y (es)? ]]
</pre>
*Sie können sogar auf die erfassten Gruppen zugreifen, die in BASH_REMATCH gespeichert sind.
*Zum Beispiel wäre $ {BASH_REMATCH [1]} "es", wenn Sie oben ein vollständiges "ja" eingeben.
*Sie erhalten die Mustererkennung aka Globbing kostenlos.
*Vielleicht sind Sie weniger streng im Schreiben von Ja. Vielleicht bist du okay, wenn der Benutzer y-irgendetwas eingibt. Haben Sie sich versichert:
*wenn $ ANSWER = y *
 
=Links=
*http://openbook.rheinwerk-verlag.de/shell_programmierung/
*http://mywiki.wooledge.org/BashFAQ/031
*http://tldp.org/LDP/abs/html/index.html
*http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_003.htm
*https://kuepper.userweb.mwn.de/informatik/printf.pdf

Aktuelle Version vom 31. Oktober 2026, 07:58 Uhr