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 $Heute
echo
= 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 + 4
let
” 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 5
Bash scripting direkt in der Kommandozeile:
for f in /tmp/*; do echo "- $f is a temporary file or folder"; done
Bashskript/-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}}"; done
for f in $(ls /tmp); do echo "in tmp liegt ${f}"; done
for f in /tmp/*; do echo "$f is a temporary file or folder"; done
for 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 UserInput
case
- 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 25.07.2024.