Bash Bashing
(→IP-Validierung) |
|||
Zeile 79: | Zeile 79: | ||
praktische Beispiele: | praktische Beispiele: | ||
+ | <source lang="bash"> | ||
VERZEICHNIS="${0%/*}" | VERZEICHNIS="${0%/*}" | ||
+ | </source> | ||
löscht alles bis zum ersten / von rechts | löscht alles bis zum ersten / von rechts | ||
ersetzt: | ersetzt: | ||
+ | <source lang="bash"> | ||
VERZEICHNIS=$(dirname "$0") | VERZEICHNIS=$(dirname "$0") | ||
− | |||
SKRIPTNAME="${0##*/}" | SKRIPTNAME="${0##*/}" | ||
+ | </source> | ||
löscht alles bis zum letzten / von links | löscht alles bis zum letzten / von links | ||
ersetzt: | ersetzt: | ||
+ | <source lang="bash"> | ||
SKRIPTNAME=$(basename "$0") | SKRIPTNAME=$(basename "$0") | ||
− | + | </source> | |
==IP-Validierung== | ==IP-Validierung== | ||
<source lang="bash"> | <source lang="bash"> |
Version vom 20. Dezember 2011, 10:32 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.
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: <source lang="bash">
VERZEICHNIS="${0%/*}"
</source> löscht alles bis zum ersten / von rechts ersetzt: <source lang="bash">
VERZEICHNIS=$(dirname "$0") SKRIPTNAME="${0##*/}"
</source> löscht alles bis zum letzten / von links ersetzt: <source lang="bash">
SKRIPTNAME=$(basename "$0")
</source>
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>