BASH
(→IP-Validierung) |
(→IP-Validierung) |
||
Zeile 119: | Zeile 119: | ||
if valid_ip $IP; then | if valid_ip $IP; then | ||
echo "IP ist eine IPv4-Adresse" | echo "IP ist eine IPv4-Adresse" | ||
+ | fi | ||
+ | |||
+ | ==dump-Backupskript== | ||
+ | |||
+ | #!/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 | fi |
Version vom 10. November 2010, 16:23 Uhr
Inhaltsverzeichnis |
(Viele) Zeilen modifizieren, in denen ein Suchmuster (regex) vorhanden ist.
sed -e '/regex/command' eingabedatei > ausgabedatei
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
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.
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
#!/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