BASH

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
Zeile 3: Zeile 3:
 
* [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]]
 
* [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]]
 
* [[Bash Bashing]]
 
* [[Bash Bashing]]
 
Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar.
 
Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
 
 
===cut, sed, grep & Co. vermeiden===
 
 
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==
 
  <source lang="bash">
 
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
 
</source>
 
  
 
==dump-Backupskript==
 
==dump-Backupskript==

Version vom 20. Dezember 2011, 00:47 Uhr


dump-Backupskript

Enthält ein paar interessante Hacks.

 <source lang="bash">
#!/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
</source>

Datei einer bestimmten Größe mit zufälligem Inhalt erstellen

Brauchbar z.B. für Bandbreitentests.

 <source lang="bash">
dd if=/dev/urandom bs=1M count=4096 of=4gb_testdatei
</source>

In diesem Beispiel wird eine 4GB große Datei erstellt.

Zufälligen String mit einer definierten Länge erzeugen

  • Kann z.B. zum erzeugen eines neuen Passwortes genutzt werden.
  • Das Bsp.-script prüft:
    • ob ein Parameter für die Länge des zu erzeugenden Strings übergeben wird,
    • ob dieser ein Integer ist
    • und dieser kleiner als 1000000 ist (dient gegen Rechnerstress).
  • Die Standardlänge des Strings ist hier 10 Zeichen.
<source lang="bash"> 
#!/bin/bash

#
# function for random string
#
function randstrg () {
        local strgLength
        local strg
        if [ $1 ]; then
                strgLength=$1
        else
                strgLength=10
        fi
 
        strg=</dev/urandom tr -dc A-Za-z0-9 | head -c $strgLength
        return $strg
}

#
# ERROR-handling if parameter 1 set, not to big  and not a integer
#
if [ ${1} ]; then
    if [ ! $(echo "${1}" | grep -E "^[0-9]+$") ] || [ "${1}" -gt 1000000 ]; then
       echo 'wrong 1. parameter ( Must be an INTEGER <= 1000000! )'
       echo 'usage:'
       echo "${0} [ INTEGER ]"
       exit
    fi
fi

#
# GO
#
strg= randstrg ${1}
echo $strg
</source>