Einführung von
echo und `..` in Generelles${}, $(), $(()) In der BASHVideo: (en) Protesilaos Stavrou - BASH Parameter Expansion [12 min]
Im Allgemeinen gilt in (fast) jeder shell:
^[a-zA-Z][\w_]*$”$”-Präfix
angesprochen, z.b. echo $SHELL$HOSTNAME - Name des Computers$HOME - eigenes Nutzerverzeichnis$PATH - Liste von Verzeichnissen
(“:”-separated), in denen nach ausführbaren Programmen
gesucht wird$PWD - aktuelles Verzeichnis=”-Zuweisung (ohne “$”-Präfix) erzeugt und
anschliessend via “$”-Präfix verwendet werden, z.B.
Heute=Freitag; echo $Heute
=”, und Wert bzw. im Wert; Ansonsten
müssen führende oder zwischenliegende Leerzeichen im Wert via
quoting eingeschlossen werden, z.B.
Text=" mit Leerzeichen "; echo "> $Text <"=”-Zuweisung können Variablen auch
überschrieben/geändert werden; sogar erweitert via
Selbstreferenz, z.B.
Heute=Freitag; Heute="ist $Heute"; echo $Heuteecho = Ausgabe von Text und Variablen
'..' double ".." quotes
echo "Meine shell ist $SHELL"echo 'shell Variable = $SHELL'-e” = Interpretation von Spezialzeichen mit führendem
“\”, wie z.B. Zeilenumbruch “\n” oder
Tabulator “\t”, z.B.
echo "Erste\nZeile"; echo -e "Nächste\nZeile"-n” = kein Zeilenumbruch am Ende der AusgabemeineShell=`echo $SHELL`; echo "Meine Shell ist $meineShell"Apple liefert aus lizenzrechtlichen Gründen nur eine veraltete
Version der Bash aus, die teilweise für einige der folgenden
Bash-Skripting Teile dieses Kurses nicht ausreicht (Version >= 4
nötig; check via “bash --version”). Daher müssen sie ggf.
jetzt ihre bash auf Mac
OS aktualisieren (Alternative
Anleitung).
In BASH (sollte man aber Folgendes tun)
${xyz}” - Zugriff auf
Variable “xyz” und weitere Manipulation
(geschweifte Klammern)
echo "_${USER}_" vs. echo "_"$USER"_"${x:-"schnurps"} - liefert den Wert von Variable
“x” oder, wenn Variable nicht verfügbar, den Wert
“schnurps”${#x} - Anzahl Zeichen des in Variable “x”
gespeicherten Wertes${x//y/z} - ersetzt alle matches von
“y” durch “z” in Variable “x
stand=1:1; echo ${stand//1/2}/” statt “//”, dann nur erster match
ersetzt
stand=1:1; echo ${stand/1/2}*” - ein oder mehrere Zeichen egal was, z.B.
stand=12:3; echo ${stand//*:/x-zu-}?” - exakt ein Zeichen. z.B.
x="nein neun"; echo ${x//e?/o}${x:i:l} - substring der Länge
“l” von Variable “x” ab Position
“i” (0=Anfang) z.B.
x=H2O; echo ${x:1:1}
x="A=BC"; echo ${x:2}${x^^} oder ${x,,} - alles
upper oder lower case
^” oder “,”${!x} - indirekter Zugriff, d.h. der WERT von Variable
“x” wird ausgewertet und nach einer Variable gesucht, die
so heisst, z.b. a=b; b=1; echo ${!a}Zudem
$(xyz) - Befehl “xyz”
ausführen (runde Klammern)
$((3+4)) - arithmetische
Berechnungen
expr” Befehl, welcher das Ergebnis direkt
ausgibt (Leerzeichen zwischen ALLEN Formelteilen!), z.B.
expr 3 + 4let” Befehl verwenden, welcher
das Ergebnis direkt in einer Variable speichert, z.B.
let "A=3+4" (hier muss i.d.R. gequotet werden!)X{A,B,C}Y = Klammererweiterung
= liefert XAY XBY XCY
{VON..BIS} = Sequenzerweiterung, z.B.
{3..1} liefert 3 2 1{VON..BIS..INK} mit Inkrementangabe, z.B.
{1..5..2} liefert 1 3 5Bash scripting direkt in der Kommandozeile:
for f in /tmp/*; do echo "- $f is a temporary file or folder"; doneBashskript/-datei - z.B. Bespieldatei
05-substring.sh zum Anschauen!
#!/usr/bin/env bash$1, $2, .. = 1., 2., … Aufrufargument$0 = Skriptname (im Aufruf, d.h. ggf. mit Pfad
etc.)$# = Anzahl der Aufrufargumente$@ liefert Array/Liste aller gegebenen Aufrufargumente
(z.B. für for-loop Iteration)Aufruf:
bash 05-substring.sh” (für heute erstmal der
Standardfall!)./05-substring.sh”
source”, z.B.
“source 05-substring.sh”
source kopiert den INHALT des
Skriptes und führt die Befehle direkt in der AKTUELLEN bash Konsole aus.
Damit kann es zu Nebeneffekten kommen (z.B. ein “exit”
Kommando im Skript schliesst die aktuelle shell!).” verwendet werden, z.B.
“. 05-substring.sh”if - Verzweigung über Ja/Nein Test ala
“if [ TEST ]; then A; else B; fi”, wobei A und
B einzelne Anweisungen oder Anweisungssequenzen
(“;”-getrennt) sein können
test” und seinen Rückgabewertelse”-Zweig ist optional[]-Blöcken mit “&&”
(und) bzw. “||” (oder) zusammengeführt werden, z.B.
“if [ TEST1 ] && [ TEST2 ]; then ...”TEST in obigem Aufruf)
"$HOME" = "${PWD}"
oder "${X}" != "lala"
=, !=, <
(lexikographisch), >, -n X (string
X ist leer), -z X (string X ist
nicht leer, z.B. -z "$HOME")-eq (==), -ne (!=), -lt
(<), -gt (>), -le (<=),
-ge (>=), z.B. “${#x} -gt 2”!” - Negierung des nachfolgenden
Tests z.B. “! ${#x} -gt 2” ist das gleiche wie
“${#x} -le 2”-e / -d = Datei / Verzeichnis
existiert,if [ ! -e /tmp/jo.txt ] || [ -s /tmp/jo.txt ]; then echo "man" > /tmp/jo.txt; fi-r / -w = Datei ist lesbar /
beschreibbar-x = Datei ist ausführbar-s = Datei ist leer (zero size)for - Wiederholung ala
“for x in LISTE; do A; done”
LISTE” ist hierbei eine Liste von Strings (white-space
separated, also auch Zeilenumbrüche möglich!), die jeweils als Werte für
die Laufvariable (hier “x”) gesetzt werden, bevor
Aufruf(sequenz) “A” jeweils ausgeführt wirdA” kann wieder Sequenzblock seinfor i in 1 5 26; do echo "${HOME:0:${i}}"; donefor f in $(ls /tmp); do echo "in tmp liegt ${f}"; donefor f in /tmp/*; do echo "$f is a temporary file or folder"; donefor ARG in $@; do ...exit - bricht das Script an dieser
Stelle ab (implizit am Ende des Skripts aufgerufen)
while - loopuntil - loopread - liest einen Text von der Kommandozeile in eine
Variable (alles bis “ENTER” gedrückt), z.B.
read UserInputcase - multiple Verzweigungfunction - Funktionsdefinition zur Automatisierung und
Programmverkürzung
function MYNAME { A }A” steht für eine beliebige Aufrufsequenz$1-$9 etc. aufrufenMYNAME 'lala' 1” (hier mit zwei Argumenten
aufgerufen)STDIN via dummy file
“/dev/stdin”
05-countLines.sh’ ab (vielleicht direkt vi
bzw. nano! ;) )ls -l | bash ./05-countLines.sh | tr " " "\n"for loop tips von Nathan Lager und Ricardo GerardiDieses umfangreiche und weiterführende
liefert viele Anwendungsbeispiele, kleine Aufgaben (Activities) und Hintergrundinformationen.
Download: PDF Version dieses Tutorials. Erstellt am 04.02.2025.