Alias und Variablen

Aus Info-Theke
Version vom 14. März 2021, 08:11 Uhr von Hamatoma (Diskussion | Beiträge) (→‎Suchen eines regulären Ausdrucks)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Ü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

Nächstes Kapitel