BASH

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
K (dump-Backupskript)
 
(24 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
==(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.==
+
[[Category:Programmierung]]
sed -e '/regex/command' eingabedatei > ausgabedatei<br /><br />
+
Bsp.: Alle Zeilen Löschen, in denen "ABC" am Anfang der Zeile steht.:
+
sed -e '/^ABC/d' eingabedatei.txt > ausgabedatei.txt
+
''Vorsicht:'' ist die Eingabedatei gleich der Ausgabedatei, dann wird die Ausgabedatei am Ende leer sein. :-(
+
  
==Bash Bashing==
+
Zum Thema '''BASH''' finden sich folgende Artikel:
 
+
* [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]]
Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar.
+
* [[Bash Bashing]]
Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
+
* [[dump-Backupskript]]
 
+
* [[Datei einer bestimmten Größe mit zufälligem Inhalt erstellen]]
===cut, sed, grep & Co. vermeiden===
+
* [[Zufälligen String mit einer definierten Länge erzeugen]]
 
+
Quelle: Folge 5, Linux-Magazin 02/10
+
 
+
====Parameter-Expansion====
+
 
+
Nach dem Schema ${<Variable><Zeichen><Suchmuster>} erledigt die Bash viele Aufgaben selbst, die sonst mit cut, sed, grep oder awk gelöst werden.
+
Als Zeichen # % / ^ , zulässig, die doppelte Angabe schaltet jeweils in den gierigen Modus und ersetzt alles bis zum letzten Vorkommen des Suchmusters.
+
 
+
{|border="1"
+
! Zeichen
+
! Bedeutung
+
! Beispiel
+
|-
+
| #
+
| Löschen von links
+
| X="aabcabcc"; ${X#a}; löscht das erste a
+
|-
+
| ##
+
| Löschen von links
+
| X="aabcabcc"; ${X##a}; löscht alle führenden a (funktioniert in Bash 3.2 nicht, wo ist der Fehler?)
+
|-
+
| %
+
| Löschen von rechts
+
| X="aabcabcc"; ${X%c}; löscht das letzte c
+
|-
+
| %%
+
| Löschen von rechts
+
| X="aabcabcc"; ${X%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?)
+
|-
+
| /
+
| Ersetzen (substitude)
+
| X="aabcabcc"; ${X/b/d}; ersetzt 1. b durch d
+
|-
+
| /
+
| Ersetzen (substitude)
+
| X="aabcabcc"; ${X/b}; löscht 1. b
+
|-
+
| //
+
| Ersetzen (substitude)
+
| X="aabcabcc"; ${X//b/d}; ersetzt alle b durch d
+
|-
+
| //
+
| Ersetzen (substitude)
+
| X="aabcabcc"; ${X//b}; löscht alle b
+
|-
+
!
+
! funktioniert erst ab Bash 4
+
!
+
|-
+
| ^
+
| Umwandeln in Großbuchstaben (uppercase)
+
| X="aabcabcc"; ${X^a}; wandelt erstes a in A
+
|-
+
| ^^
+
| Umwandeln in Großbuchstaben (uppercase)
+
| X="aabcabcc"; ${X^^bc}; wandelt alle bc in BC
+
|-
+
| ^^
+
| Umwandeln in Großbuchstaben (uppercase)
+
| X="aabcabcc"; ${X^^}; wandelt alles in Grossbuchstaben
+
|-
+
| ,
+
| Umwandeln in Kleinbuchstaben (lowercase)
+
| X="AABCABCC"; ${X,A}; wandelt erstes A in a
+
|-
+
| ,,
+
| Umwandeln in Kleinbuchstaben (lowercase)
+
| X="AABCABCC"; ${X,,BC}; wandelt alle BC in bc
+
|-
+
| ,,
+
| Umwandeln in Kleinbuchstaben (lowercase)
+
| X="AABCABCC"; ${X,,}; wandelt alles in Kleinbuchstaben
+
|}
+
 
+
praktische Beispiele:
+
VERZEICHNIS="${0%/*}"
+
löscht alles bis zum ersten / von rechts
+
ersetzt:
+
VERZEICHNIS=$(dirname "$0")
+
+
SKRIPTNAME="${0##*/}"
+
löscht alles bis zum letzten / von links
+
ersetzt:
+
SKRIPTNAME=$(basename "$0")
+
 
+
==IP-Validierung==
+
 
+
function valid_ip()
+
{
+
    local  ip=$1
+
    local  stat=1
+
+
    # bash 2:
+
    # if ( echo $ip | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' > /dev/null ) ; then
+
    # bash 3:
+
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+
        OIFS=$IFS
+
        IFS='.'
+
        ip=($ip)
+
        IFS=$OIFS
+
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+
        stat=$?
+
    fi
+
    return $stat
+
}
+
+
if valid_ip $IP; then
+
    echo "IP ist eine IPv4-Adresse"
+
fi
+
 
+
==dump-Backupskript==
+
 
+
Enthält ein paar interessante Hacks.
+
 
+
#!/bin/bash
+
# Funktionen
+
function backup_age() {
+
  LEVEL=$1
+
  if ! test -f /tmp/backups/home/$LEVEL; then
+
        return 1
+
  fi
+
  LAST_DUMP=$(file /tmp/backups/home/$LEVEL \
+
        | grep -o "... ... .. ..:..:.. ...." | head -1)
+
  LAST_DUMP_EPOCH=$(date +%s -d "$LAST_DUMP")
+
  NOW_EPOCH=$(date +%s)
+
  echo $((NOW_EPOCH - LAST_DUMP_EPOCH))
+
}
+
function cleanup() {
+
  LEVEL=$1
+
  rm -f /tmp/backups/home/*.tmp
+
  for file in /tmp/backups/home/*
+
  do
+
        base=$(basename $file)
+
        test "$base" = "*" && break
+
        test "$base" -le $LEVEL && continue
+
        rm $file
+
  done
+
}
+
+
# Programm
+
if ! test $(id -u) = 0; then
+
  echo "$0: Keine Root-Rechte!" >&2
+
  exit 1
+
fi
+
if ! backup_age 0 \
+
  || test $(backup_age 0) -gt 604800; then
+
  dump -u -0 -f /tmp/backups/home/0.tmp /home \
+
  && mv /tmp/backups/home/0{.tmp,}
+
  cleanup 0
+
elif ! backup_age 1 \
+
  || test $(backup_age 1) -gt 86400; then
+
  dump -u -1 -f /tmp/backups/home/1.tmp /home \
+
  && mv /tmp/backups/home/1{.tmp,}
+
  cleanup 1
+
else
+
  dump -u -2 -f /tmp/backups/home/2.tmp /home \
+
  && mv /tmp/backups/home/2{.tmp,}
+
  cleanup 2
+
fi
+

Aktuelle Version vom 21. Dezember 2011, 20:28 Uhr


Zum Thema BASH finden sich folgende Artikel: