Bash

Aus Info-Theke
Zur Navigation springen Zur Suche springen

Links


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

Datei zeilenweise abarbeiten

function Example(){
  local fnDiff=$1
  local lines
  local file=/tmp/dummy
  mapfile -t <$file lines
  local count=${#lines[@]}
  local ix=0
  while [ $ix -lt $count ]; do
    local line=${lines[$ix]}
    ix=$(expr $ix + 1)
  done
}