Alias und Variablen
Version vom 14. März 2021, 08:11 Uhr von Hamatoma (Diskussion | Beiträge) (→Suchen eines regulären Ausdrucks)
Übersicht über das Konsolen-Tutorial
Alias-Definitionen
Eine einfache Möglichkeit, Tipporgien zu vermeiden, sind Alias-Definitionen:
- Ein 'Alias ist ein Name für eine Zeichenfolge.
- Wird ein Alias-Name erkannt, wird der Name durch die Zeichenfolge ersetzt.
- Ein Alias wird nur im ersten Wort einer Eingabe erkannt.
- Eine Ersetzung findet nur einmal statt. Das erste Wort der Ersetzung wird nicht auf Aliasnamen untersucht.
- Eine Alias-Erkennung findet (normalerweise) nur im interaktiven Modus statt.
- Ein Alias kennt keine Argumente wie Funktionen oder Scripte.
alias g_app="cd /usr/share/applications"
g_app
Oft wird auch ein Alias verwendet, Optionen von Kommandos festzulegen:
alias lT='ls -ldtr'
lT /usr/bin
Damit werden die Dateien von /usr/bin angezeigt, nach Datum absteigend sortiert.
Da die Alias-Expansion nicht rekursiv erfolgt, können wir damit "Daueroptionen" einschalten:
alias grep="grep -i"
Damit erreichen wir, dass jeder Aufruf von grep automatisch die Groß/Kleinschreibung ignoriert.
Anzeigen und Löschen
Alle Alias-Definitionen erhalten wir mit:
alias
Die Defintion einer Aliasses:
alias lT
Löschen erreichen wir mit:
unalias grep
Funktionen
- Eine Funktion ist ein Name für eine Folge von Befehlen.
- Sie verhält sich wie ein Programm, wird also normalerweise mit Argumenten aufgerufen.
- Eine Funktion wird nur im ersten Wort einer Eingabe erkannt.
function findDocs() { find $1 -name "*.txt" ; }
- Die Argumente können im Rumpf (also zwischen den geschweiften Klammern), benutzt werden, und zwar mit $<positionsnummer>.
- Hier wird nur das erste Argument $1 verwendet.
- Diese Definition kann nicht durch ein Alias ersetzt werden, da ein Alias keine Argumente kennt.
Aufgerufen wird die Funktion z.B. so:
findDocs /usr/share | grep -i index
Variablen
Einfache Variable
- Eine 'Variable ist ein Name für eine Zeichenfolge.
- Wird eine Variable erkannt, wird der Name durch die Zeichenfolge ersetzt.
- Eine wird überall in der Eingabe erkannt.
- Eine Ersetzung findet nur einmal statt. Kommt eine Variable im Wert einer anderen Variablen vor, erfolgt die Expansion nur bei der Definition.
- Die Verwendung der Variablen X erfolgt durch $X oder ${X}. Die zweite Form ist notwendig, wenn dahinter ein Zeichen folgt, das zum Namen gehören könnte.
- Wird eine Variable verwendet, die nicht definiert ist, wird sie durch nichts ersetzt.
X="Donaudampfschifffahrtsgesellschaftskapitän"
echo Ein $X oder zwei ${X}e brauchen viel Zeit beim Begrüßen!
Ein Donaudampfschifffahrtsgesellschaftskapitän oder zwei Donaudampfschifffahrtsgesellschaftskapitäne brauchen viel Zeit beim Begrüßen!
Arrays
- Ein Array ist eine Variable mit mehreren Werten, die über Schlüssel angesprochen werden.
- Der Schlüssel kann entweder eine Zahl oder ein String sein.
- Die Anzahl der Elemente eines Arrays bekommt man mit ${NAME[@]}
X[0]=1234.78 ; X[1]=44 ; FARBE["schrift"]=gelb
echo ${X[0]} ${X[1]} Farbe: ${FARBE[schrift]}
- Die Anzahl der Elemente eines Arrays bekommt man mit ${#NAME}
- ${NAME[*]} liefert alle Elemente des Arrays mit Blank getrennt:
- Die Länge des n-ten Elements gibt es mit ${#NAME[n]}
echo Anzahl X: ${#X[*]} Länge gelb: ${#FARBE[schrift]} Elemente von X: ${X[*]}
Anzahl X: 2 Länge FARBE[schrift]: 4 Elemente von X: 1234.78 44
Positionsparameter
- Scripte und Funktionen haben Positionsparameter.
- Diese werden beim Aufruf definiert
- Der Name ist die jeweilige Positionsnumemr, ab 1 gezählt.
- $0 ist der Name des ausführenden Scripts.
- $* sind alle Positionsparameter hintereinander, getrennt mit ' ', genauer dem ersten Zeichen von $IFS.
- $# Ist die Anzahl der Parameter
function F() { echo F: $0 P1: $1 P2: $2 Anzahl: $# Alle: $* ; }
F berlin bonn
F: /bin/bash P1: berlin P2: bonn Anzahl: 2 Alle: berlin bonn
Operationen mit Variablen
Vorbelegung
- Syntax: ${name:-vorbelegung}
- Ist die Variable undefiniert oder leer, wird der Vorbelegungswert genommen, sonst der Variablenwert.
NIX=;WAS=orginal;echo NIX: ${NIX:-Doch was} WAS: ${WAS:-Doch was}
NIX: Doch was WAS: orginal
Alternativwert
- Syntax: ${name:+alternative}
- Ist die Variable nicht undefiniert und nicht leer, wird der Alternativwert genommen, sonst der Leerstring.
NIX=;WAS=orginal;echo NIX: ${NIX:+Denkste} WAS: ${WAS:+Denkste}
NIX: WAS: Denkste
Teilstring
- Syntax: ${name:offset} oder ${name:offset:länge}
- Es wird der durch Offset und Länge definierte Ausschnitt aus dem Variablenwert geliefert.
- Ist keine Länge angegeben, gilt die maximal mögliche.
- Ein nichtnegativer Offset ist 0-basiert
- Ist der Offset negativ, bezieht er sich auf das Ende des Variablenwertes.
- Offset und Länge dürfen arithmetische Ausdrücke sein.
- Vor dem Minuszeichen eines Offset muss ein Leerzeichen stehen.
X=Ananas ; Y=3; echo ${X:0:3} ${X: -2} $X ${X:$Y}s.
Ana as Ananas nass.
Entfernen eines Präfixes
- Syntax: ${name#muster} oder ${name##muster}
- Wird am Anfang des Variablenwertes das Muster erkannt, wird dieses abgeschnitten.
- Die Syntax des Musters ist wie bei der Dateinamensexpansion: *, ? und [] sind Metazeichen.
- Die erste Variante findet das kürzestmögliche Muster, die 2.te das längstmögliche.
X=Datei.01.txt ; echo "#:" ${X#*.} "##:" ${X##*.}
#: 01.txt ##: txt
Entfernen eines Suffixes
- Syntax: ${name%muster} oder ${name%%muster}
- Wird am Ende des Variablenwertes das Muster erkannt, wird dieses abgeschnitten.
- Die Syntax des Musters ist wie bei der Dateinamensexpansion: *, ? und [] sind Metazeichen.
- Die erste Variante findet das kürzestmögliche Muster, die 2.te das längstmögliche.
X=Datei.01.txt ; echo "%:" ${X%.*} "%%:" ${X%%.*}
%: Datei.01 %%: Datei
Ersetzen eines Teilstrings
- Syntax: ${name/muster/ersetzung}
- Wird das Muster im Variablenwert gefunden, wird es einmal ersetzt.
- Sollen alle Teilstrings ersetzt werden gilt die Syntax:
- ${name//muster/ersetzung}
- Die Syntax des Musters ist wie bei der Dateinamensexpansion: *, ? und [] sind Metazeichen.
- '\' ist ESC-Zeichen: das folgende Zeichen wird nicht als Metazeichen interpretiert
X=Datei.01.txt ; echo ${X/Datei./artikel_}
UNIX_PATH=/abc/def ; WIN_PATH=${UNIX_PATH//\//\\} ; echo $WIN_PATH
artikel_01.txt \abc\def
Suchen eines regulären Ausdrucks
- Syntax: expr $name : <regex>
- expr liefert als Ergebnis 0, wenn der Ausdruck gefunden wurde, 1 wenn nicht.
- Hinweis: der reg. Ausdruck bezieht sich immer auf den Stringanfang, enthält also implizit einen "^".
- folgende Syntaxelemente habe ich gefunden:
- beliebig oft: "a*"
- maximal einmal: "a\?"
- mindestens einmal: "a\+"
- Anzahl Vorkommen "a\{1,5\}"
- Klammerung "\(T:)\?[0-9-]*"
- Alternativen: "affe\|gnu"
- Hinweis: expr gibt zusätzlich die Länge des gefundenen Ausdrucks aus, also nach /dev/null umleiten, wenn nicht gewünscht
X="ab2"
if expr $X : "[a-z][a-z0-9]*" > /dev/null ; then
echo "X ist ein Identifier"
fi
Spezialvariablen
- $0 Der Name des aufgerufenen Scripts
- $* Die Liste aller Positionsparameter, also $1 $2 $3 ...
- $# Die Anzahl der Positionsparameter
- $? Der Exit-Wert des zuletzt gestarteten Vordergrund-Programms
- $$ Die Prozess-Id der Shell
- $! Die Prozess-Id des zuletzt im Hintergrund gestarteten Programms