BASH
(→(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.) |
|||
| Zeile 1: | Zeile 1: | ||
[[Category:Programmierung]] | [[Category:Programmierung]] | ||
| − | [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]] | + | * [[(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.]] |
| − | + | * [[Bash Bashing]] | |
| − | + | ||
Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. | Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. | ||
Version vom 19. Dezember 2011, 23:45 Uhr
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.
Inhaltsverzeichnis |
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.
| 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
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>